将同一个体上的多个观察结果汇总成一行,将多个列添加为新列

时间:2014-02-03 21:32:35

标签: r reshape

我的数据如下:

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),但似乎没有一个问题可以解决我的问题,因为他们不是从类似的数据结构开始,或者他们不关心哪个实例数据最终匹配...

2 个答案:

答案 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