我的数据如下:
ID X1 X2 X3
1 1.4 2 two
2 7.6 30 thirty
2 7.6 50 fifty
2 7.6 40 forty
3 5.6 40 forty
3 5.6 50 fifty
4 3.5 NA NA
5 NA 2 two
ID表示个体,X1是每个人一次测量,X2和X3是相同治疗的字符和字符串表示。例如,对于个体2,X1 = 7.6,并且经受处理X2 = 30,50和40(其具有相关联的其他信息,X3 =三十,五十和四十)
我希望它最终看起来像这样,每个人只有一行,同一个人的多个观察值作为新列添加:
ID X1 X2a X3a X2b X3b X2c X3c
1 1.4 2 two NA NA NA NA
2 7.6 30 thirty 50 fifty 40 forty
3 5.6 40 forty 50 fifty NA NA
4 3.5 NA NA NA NA NA NA
5 NA 2 two NA NA NA NA
我希望保留X1 = NA的行(如主题5),因为这些行在其他列中具有感兴趣的测量值,为了简化我的示例,这些列主要被排除在外。 我的实际数据集非常大(10,000行,可能是50列),因此可以有效处理相当大的数据集的方法将是一个优势。
我一直在玩reshape包中的melt()和cast(),我认为它可以做我想要的。但是,我收到一个错误要求我聚合(错误:聚合需要fun.aggregate:默认使用长度),我不想这样做。融化和铸造合作的建议?还是更好的方法呢?
我发现了许多类似的问题(例如this one),但似乎没有一个问题可以解决我的问题,因为他们不是从类似的数据结构开始,或者他们不关心哪个实例数据最终匹配...
答案 0 :(得分:4)
这是一个选项:
library(data.table)
dt = data.table(your_df)
# get number of columns first (6 here)
max.N = max(dt[, .N*ncol(.SD), by = list(ID, X1)]$V1)
# now construct the result by filling in appropriate # of NA's
dt[, as.list(c(t(.SD), rep(NA, max.N - .N*ncol(.SD)))), by = list(ID, X1)]
# ID X1 V1 V2 V3 V4 V5 V6
#1: 1 1.4 2 two NA NA NA NA
#2: 2 7.6 30 thirty 50 fifty 40 forty
#3: 3 5.6 40 forty 50 fifty NA NA
#4: 4 3.5 NA NA NA NA NA NA
#5: 5 NA 2 two NA NA NA NA
答案 1 :(得分:1)
从版本1.9.6开始(在CRAN 2015-09-19上),data.table
的{{1}}函数可以同时投放多个dcast()
列。
value.var
dcast(DT, ID + X1 ~ rowid(ID), value.var = c("X2", "X3"))
ID X1 X2_1 X2_2 X2_3 X3_1 X3_2 X3_3
1: 1 1.4 2 NA NA two NA NA
2: 2 7.6 30 50 40 thirty fifty forty
3: 3 5.6 40 50 NA forty fifty NA
4: 4 3.5 NA NA NA NA NA NA
5: 5 NA 2 NA NA two NA NA