gpt4 book ai didi

r - 将同一个人的多个观察结果压缩到一行中,将倍数添加为新列

转载 作者:行者123 更新时间:2023-12-04 12:15:33 25 4
gpt4 key购买 nike

我有这样的数据:

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

最佳答案

这是一个选项:

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

关于r - 将同一个人的多个观察结果压缩到一行中,将倍数添加为新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21538244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com