将同一个体上的多个观测压缩到一行中,将多个数据添加为新列 [英] Condensing multiple observations on the same individual into a single row, adding multiples as new columns
本文介绍了将同一个体上的多个观测压缩到一行中,将多个数据添加为新列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的数据如下所示:
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=30、50和40)
我希望它最终看起来像这样,每个人只有一行,来自同一个人的多个观测值作为新列添加:
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的行(就像Subject 5一样),因为这些行在其他列中包含感兴趣的度量值,为了简单起见,这些列大多被排除在外。 我的实际数据集非常大(10,000行,可能50列),因此能够有效地处理相当大的数据集的方法将是一个优势。
我一直在使用来自重塑包的Melt()和cast(),我认为它可以做我想做的事情。但是,我收到了一个错误,要求我进行聚合(错误:聚合需要fun.Aggregate:默认长度),这是我不想做的。让熔化和铸造合作的建议?或者是更好的方法?
我发现了许多类似的问题(例如,this one),但似乎没有一个解决我的问题,因为它们不是从类似的数据结构开始的,或者他们不关心数据的哪些实例最终与哪些匹配...
推荐答案
这里有一个选项:
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
这篇关于将同一个体上的多个观测压缩到一行中,将多个数据添加为新列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文