重新排列多列数据框

时间:2019-01-31 22:19:15

标签: r dataframe

我想按以下方式重新排列我的数据框:前三列必须在另一列之后以及第二列3之下附加。ID和Class列必须根据数据框重新排列而保留。

起始数据框ID df

set.seed(1)
 df <- data.frame(ID = rep(c("CT1", "CT2", "CT3", "SB1", "SB2","SB3","AM1", "AM2", "AM3")),
                     Class = rep(c("CT", "SB", "AM"), each = 3),
                     replicate(6,sample(0:100,9,rep=TRUE)))

输出为df2

set.seed(1)
    df2 <- data.frame(ID = c(rep(c("CT1", "CT2", "CT3", "SB1", "SB2","SB3","AM1", "AM2", "AM3" ), times=3)),
                            Class =  rep(rep(c("CT", "SB", "AM"), each= 3), times=3),
                            replicate(2,sample(0:100,27,rep=TRUE)))

我尝试了merge id.varsID来利用Class的几种方法

2 个答案:

答案 0 :(得分:2)

我们可能会使用

data.frame(df[, c("ID", "Class")], X1 = unlist(df[, 3:5]), X2 = unlist(df[, 6:8]))
#      ID Class X1 X2
# X11 CT1    CT 26 38
# X12 CT2    CT 37 87
# X13 CT3    CT 57 34
# X14 SB1    SB 91 48
# X15 SB2    SB 20 60
# X16 SB3    SB 90 49
# ...

前两列通过回收扩展,而其他两列使用unlist方便地构造。如果这是您的实际问题,并且没有成百上千的三胞胎,那么在这种情况下,实际上并不需要任何花哨的东西。

答案 1 :(得分:1)

可以使用meltdata.table设置多列列

library(data.table)
melt(setDT(df), measure = list(3:5, 6:8), value.name = c('X1', 'X2'))[,
                 variable := NULL][] 
#    ID Class X1 X2
#1: CT1    CT 26 38
#2: CT2    CT 37 87
#3: CT3    CT 57 34
#4: SB1    SB 91 48
#5: SB2    SB 20 60
#6: SB3    SB 90 49
# ...