R 按ID对数据帧中的唯一行进行分组,并将相关值堆叠为新列
我正在尝试转换一个数据帧,其中个人按家庭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
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