将同一个体上的多个观测压缩到一行中,将多个数据添加为新列 [英] Condensing multiple observations on the same individual into a single row, adding multiples as new columns

查看:10
本文介绍了将同一个体上的多个观测压缩到一行中,将多个数据添加为新列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的数据如下所示:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆