R 按ID对数据帧中的唯一行进行分组,并将相关值堆叠为新列

R 按ID对数据帧中的唯一行进行分组,并将相关值堆叠为新列,r,plyr,reshape2,R,Plyr,Reshape2,我正在尝试转换一个数据帧,其中个人按家庭ID分组。而不是: FAMID1 ID1 Age Sex Q1 Q2 ...... 21 1 18 M T 4 21 2 21 F F 2 22 1 13 F T 3 22 2 16 F F 1 23 1 18 M T 3 23 2 18 M T 3 我想得到: FAMID ID

我正在尝试转换一个数据帧,其中个人按家庭ID分组。而不是:

FAMID1 ID1  Age  Sex  Q1  Q2 ......
21     1    18   M    T   4
21     2    21   F    F   2
22     1    13   F    T   3
22     2    16   F    F   1
23     1    18   M    T   3
23     2    18   M    T   3
我想得到:

FAMID  ID1  ID2  Age1  Age2  Sex1  Sex2 Q1.1. Q1.2....
21     1    2    18    21     M     F    T     F
22     1    2    13    16     F     F    T     F
23     1    2    18    18     M     M    T     T

我尝试过使用
melt(restrape2)
mutate(ddply)
但是我有几百个变量,我无法将它们全部放在数据帧的同一行中。我不想对像“聚合”这样的变量求和,我只想将一行与另一行叠加,并更改所有变量名称以反映它是族中的哪个成员。

您可以使用
数据来实现这一点。表从长到宽都可以。
reshape(direction = "wide", data=df, idvar = c("FAMID1"), 
        v.names = c("ID","Age","Sex","Q1","Q2"), timevar = "ID")

#   FAMID1 ID.1 Age.1 Sex.1 Q1.1 Q2.1 ID.2 Age.2 Sex.2  Q1.2 Q2.2
#1:     21    1    18     M TRUE    4    2    21     F FALSE    2
#2:     22    1    13     F TRUE    3    2    16     F FALSE    1
#3:     23    1    18     M TRUE    3    2    18     M  TRUE    3
列出了各种其他示例

如果你有很多列,你可以这样做

colnames(df)
cols<-colnames(df)[-1]
dcast(df, FAMID1 ~ ID1, value.var = cols)

您可能需要给出一个易于复制的具体示例。一些指导:如果没有,我们可以说“看看
melt
等等”,但你已经知道了。也许这就是问题所在,但是
使它看起来像伪代码。对不起,堆栈溢出是个新问题。你所说的具体示例是什么意思?对不起,是的,我的意思是它应该很容易复制(最好可以通过复制粘贴到R控制台),并且所需的输出应该与输入精确对应。(后者在这里可能成立,但对我来说并不明显,因为您添加了省略号,使其看起来像是与某个较大示例对应的草图,其他列没有明确列出。)据我所知,这是一种非常常见的宽重塑。您输入的预期输出是否错误?看起来Q2.2列应该是Q1.2?有没有办法将v.names延续到数据集的末尾?也就是说,你能不能把第二行v.names=c(“ID”:“Q2”)?我有几百个变量,所以如果可能的话,我想缩短-这就是我遇到麻烦的地方。@DanLordan为什么不将它替换为
v.names=colnames(df)[-1]
colnames(df)
cols<-colnames(df)[-1]
dcast(df, FAMID1 ~ ID1, value.var = cols)
   FAMID1 ID1.1_1 ID1.1_2 Age_1 Age_2 Sex_1 Sex_2  Q1_1  Q1_2  Q2_1 Q2_2
 1:   21     1       2      18    21     M     F   TRUE FALSE    4    2
 2:   22     1       2      13    16     F     F   TRUE FALSE    3    1
 3:   23     1       2      18    18     M     M   TRUE  TRUE    3    3