首页 > 解决方案 > 重塑长到宽添加额外的列

问题描述

我有一个看起来像这样的数据框:

ID   X   Y

 1   A   A
 1   B   A
 2   C   A
 3   A   K
 3   A   A

到目前为止,我能找到的所有用于重复测量等的解决方案都依赖于一个指标,该指标在所有观察结果中都不同,但在我的情况下,我没有。我基本上想总结ID数据集中每个行的所有观察结果。

最后它应该看起来像这样的宽格式

ID   X1   Y1   X2   Y2   

1    A    A    B    A 
2    C    A    NA   NA #since there is only one observation for 2 the values for X2 and Y2 should be NA
3    A    K    A    A

知道怎么做吗?如果可能的话,我更愿意使用data.table

标签: rdata.tablereshape

解决方案


library(data.table)
setDT(df)

melt(df, 1)[, i := paste(variable, 1:.N, sep = "_"), 
                keyby = .(ID, variable)][, dcast(.SD, ID ~ i), 
                                             .SDcols = c("ID", "value", "i")]

>    ID X_1  X_2 Y_1  Y_2
  1:  1   A    B   A    A
  2:  2   C <NA>   A <NA>
  3:  3   A    A   K    A

你有:

  • 首先你融化数据,所以你有一列下的所有 X 和 Y 值
  • 然后你创建一个新变量,告诉你这是第一个还是第二个 X 或 Y,按 ID 和变量分组(所以它们是有意义的)
  • 然后你转换到该表的宽度,保留ID为一列,并将新变量作为列标题。您删除了该列variable,因为您已经对其进行了编码i

推荐阅读