我想按以下方式重新排列我的数据框:前三列必须在另一列之后以及第二列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.vars
和ID
来利用Class
的几种方法
答案 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)
可以使用melt
来data.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
# ...