【问题标题】:group unique rows in a dataframe by ID, and stack related values as new column按 ID 对数据框中的唯一行进行分组,并将相关值堆叠为新列
【发布时间】:2016-12-20 18:18:00
【问题描述】:

我正在尝试转换一个数据框,其中个人按家庭 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 (reshape2)mutate (ddply),但我有几百个变量,我无法将它们全部放入数据框的同一行。我不想对aggregate 之类的变量求和,我只想将一行与另一行叠加并更改所有变量名称以反映它是哪个家族成员。

【问题讨论】:

  • 您可能需要给出一个可以轻松复制的具体示例。一些指导:stackoverflow.com/questions/5963269/… 没有一个,大多数情况下我们可以说“看看melt 等”,但你已经知道这些了。也许就是这样,但... 让它看起来很伪。
  • 对不起,新的堆栈溢出。具体的例子是什么意思?
  • 对不起,是的,我的意思是它应该很容易复制(最好可以通过复制粘贴到 R 控制台中),并且所需的输出应该与输入精确对应。 (后者在这里可能成立,但对我来说并不明显,因为您添加了椭圆,使其看起来像一个草图,对应于一些更大的示例,其他列未明确列出。)
  • 据我所知,这是一个很常见的重塑宽度。
  • 您是否输入了错误的预期输出?看起来 Q2.2 列应该是 Q1.2 ?

标签: r plyr reshape2


【解决方案1】:
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

【讨论】:

  • 有没有办法将 v.names 延续到数据集的末尾? IE。你能写第二行 v.names = c ("ID" : "Q2") 吗?我有几百个变量,因此希望尽可能缩短 - 这就是我遇到麻烦的地方。
  • @DanLordan 你为什么不把它换成v.names = colnames(df)[-1]
【解决方案2】:

您可以使用data.table 长到宽来实现此目的。 列出了各种其他示例here

library(data.table)
setDT(df)

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

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

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 2017-11-20
    • 2022-01-13
    • 2021-09-16
    • 2019-11-02
    相关资源
    最近更新 更多