R 将数据集从宽更改为长,同时保留组id,并收集列

R 将数据集从宽更改为长,同时保留组id,并收集列,r,R,我真的很感激你能帮我把这些杂乱无章的新调查数据整理成一个有用的表格。它是以一种奇怪的方式收集的,现在我有奇怪的数据要处理。我已经浏览了tidyr并使用了这些方法。我怀疑我的问题是,我对这个数据集的想法完全错了,我对一些真正的答案视而不见。但是考虑到我需要对这个df做的所有事情,我不知道从哪里开始,也不知道从哪里开始谷歌搜索 我需要的是: 让每个人都成为自己的一行 每个人都保留其GroupID和治疗价值 用于将当前附加到每个人的变量单独变为列(年龄、体重、身高) 假的(小得多): 如果您能为我提供

我真的很感激你能帮我把这些杂乱无章的新调查数据整理成一个有用的表格。它是以一种奇怪的方式收集的,现在我有奇怪的数据要处理。我已经浏览了tidyr并使用了这些方法。我怀疑我的问题是,我对这个数据集的想法完全错了,我对一些真正的答案视而不见。但是考虑到我需要对这个df做的所有事情,我不知道从哪里开始,也不知道从哪里开始谷歌搜索

我需要的是: 让每个人都成为自己的一行 每个人都保留其GroupID和治疗价值 用于将当前附加到每个人的变量单独变为列(年龄、体重、身高)

假的(小得多):


如果您能为我提供任何帮助或进一步的阅读资料,我将不胜感激。

重塑
可以做到这一点,并提供适当的参数:

> reshape(x, direction="long", varying=names(x)[3:11], timevar='person', v.names=c('height', 'age', 'weight'), sep='_')
    GroupID Treated person height age weight id
1.1       1       Y      1    187  45     69  1
2.1       2       Y      1    145  33     64  2
3.1       3       N      1    136  71     51  3
4.1       4       Y      1    201  19     70  4
5.1       5       N      1    168  52     66  5
1.2       1       Y      2    140  54     62  1
2.2       2       Y      2    122  20     70  2
3.2       3       N      2    186  48     65  3
4.2       4       Y      2    160  63     72  4
5.2       5       N      2    232  26     74  5
1.3       1       Y      3    112  21     61  1
2.3       2       Y      3    143  56     69  2
3.3       3       N      3    187  40     73  3
4.3       4       Y      3    194  59     63  4
5.3       5       N      3    159  67     72  5
这取决于原始数据中列的顺序,因为
variable
参数在原始数据中的顺序是递增的

如果情况并非如此,请手动指定
变化
。下面是上面使用的内容:

> names(x)[3:11]
[1] "person1_age"    "person1_weight" "person1_height" "person2_age"    "person2_weight" "person2_height"
[7] "person3_age"    "person3_weight" "person3_height"

我们还可以使用
melt
from
data.table
,它可以在
measure
参数中获取多个
模式

library(data.table)
melt(setDT(x), measure = patterns("age$", "weight$", "height$"), 
     variable.name = "person", value.name = c("age", "weight", "height"))
#     GroupID Treated person age weight height
# 1:       1       Y      1  45    187     69
# 2:       2       Y      1  33    145     64
# 3:       3       N      1  71    136     51
# 4:       4       Y      1  19    201     70
# 5:       5       N      1  52    168     66
# 6:       1       Y      2  54    140     62
# 7:       2       Y      2  20    122     70
# 8:       3       N      2  48    186     65
# 9:       4       Y      2  63    160     72
#10:       5       N      2  26    232     74
#11:       1       Y      3  21    112     61
#12:       2       Y      3  56    143     69
#13:       3       N      3  40    187     73
#14:       4       Y      3  59    194     63
#15:       5       N      3  67    159     72
library(data.table)
melt(setDT(x), measure = patterns("age$", "weight$", "height$"), 
     variable.name = "person", value.name = c("age", "weight", "height"))
#     GroupID Treated person age weight height
# 1:       1       Y      1  45    187     69
# 2:       2       Y      1  33    145     64
# 3:       3       N      1  71    136     51
# 4:       4       Y      1  19    201     70
# 5:       5       N      1  52    168     66
# 6:       1       Y      2  54    140     62
# 7:       2       Y      2  20    122     70
# 8:       3       N      2  48    186     65
# 9:       4       Y      2  63    160     72
#10:       5       N      2  26    232     74
#11:       1       Y      3  21    112     61
#12:       2       Y      3  56    143     69
#13:       3       N      3  40    187     73
#14:       4       Y      3  59    194     63
#15:       5       N      3  67    159     72