对R中具有特定头的数据进行排序

zbsbpyhn  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(110)

下面是一小部分数据:

df<-read.table (text=" ID   Class1a Time1a  MD1a    MD2a    Class1b Time1b  MD1b    MD2b    Class2a Time2a  MD3a    MD4a    Class2b Time2b  MD3b    MD4b    Class3a Time3a  MD5a    MD6a    Class3b Time3b  MD5b    MD6b
1   1   1   1   2   2   1   1   2   9   2   2   2   10  2   1   1   17  3   2   2   18  3   1   1
2   3   1   1   1   4   1   2   1   11  2   2   1   12  2   1   1   19  3   2   1   20  3   1   1
3   5   1   2   1   6   1   2   2   13  2   1   1   14  2   2   2   21  3   1   1   22  3   2   2
4   7   1   1   1   8   1   2   2   15  2   1   1   16  2   1   1   23  3   1   1   24  3   1   1
", header=TRUE)

我希望得到以下输出,尤其是头

ID  Class   Time    MD  MD1 MD2
1   1   1   1-2 1   2
2   3   1   1-2 1   1
3   5   1   1-2 2   1
4   7   1   1-2 1   1
1   2   1   1-2 1   2
2   4   1   1-2 2   2
3   6   1   1-2 2   2
4   8   1   1-2 2   2
1   9   2   3-4 2   2
2   11  2   3-4 2   1
3   13  2   3-4 1   1
4   15  2   3-4 1   1
1   10  2   3-4 2   1
2   12  2   3-4 2   1
3   14  2   3-4 2   2
4   16  2   3-4 2   1
1   17  3   5-6 2   2
2   19  3   5-6 2   2
3   21  3   5-6 1   2
4   23  3   5-6 1   2
1   18  3   5-6 1   1
2   20  3   5-6 1   1
3   22  3   5-6 2   2
4   24  3   5-6 1   1
df1<- df %>% pivot_longer(
      cols = starts_with("Time"),
      names_to = "Q",
      values_to = "Score",
      values_drop_na = TRUE)
    df2<- df1 %>% pivot_longer(
      cols = starts_with("Class"),
      names_prefix = "MD",
      values_drop_na = TRUE
    ) %>% dplyr::select(-value)

但是我没有得到感兴趣的输出

lb3vh1jj

lb3vh1jj1#

这个答案一开始是使用names_patternpivot_longer示例,但是尽管重命名其中一些列是有意义的,但是如何在透视过程中轻松地提取MD列(例如1-23-4)变得不那么直观。
相反,让我们按列组拆分框架,根据需要重命名列,然后bind_rows它们。

bind_rows(
  lapply(split.default(df[,-1], cumsum(grepl("Class", names(df)[-1]))), 
         function(Z) {
           out <- transform(Z, 
             ID = df$ID,
             MD = paste(gsub("\\D", "", grep("^MD", names(Z), value = TRUE)), collapse = "-"))
           names(out)[1:4] <- c("Class", "Time", "MD1", "MD3")
           out
         })
)
#    Class Time MD1 MD3 ID  MD
# 1      1    1   1   2  1 1-2
# 2      3    1   1   1  2 1-2
# 3      5    1   2   1  3 1-2
# 4      7    1   1   1  4 1-2
# 5      2    1   1   2  1 1-2
# 6      4    1   2   1  2 1-2
# 7      6    1   2   2  3 1-2
# 8      8    1   2   2  4 1-2
# 9      9    2   2   2  1 3-4
# 10    11    2   2   1  2 3-4
# 11    13    2   1   1  3 3-4
# 12    15    2   1   1  4 3-4
# 13    10    2   1   1  1 3-4
# 14    12    2   1   1  2 3-4
# 15    14    2   2   2  3 3-4
# 16    16    2   1   1  4 3-4
# 17    17    3   2   2  1 5-6
# 18    19    3   2   1  2 5-6
# 19    21    3   1   1  3 5-6
# 20    23    3   1   1  4 5-6
# 21    18    3   1   1  1 5-6
# 22    20    3   1   1  2 5-6
# 23    22    3   2   2  3 5-6
# 24    24    3   1   1  4 5-6

这取决于:

  • ID是第一列(因此df[,-1]names(df)[-1]),以及
  • 每组列以Class*列开始。

相关问题