重塑长到宽添加额外的列

Reshape long to wide adding additional columns

我有一个如下所示的数据框:

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

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 和变量分组(因此它们有意义)
  • 然后将 table 转换为宽,将 ID 保留为一列,并将新变量作为列 headers。您删除了列 variable,因为您已经在 i.
  • 中对其进行了编码

我们可以使用 rowid 创建一个唯一的 ID,您可以在该 ID 上将数据投射到宽。

library(data.table)
dcast(setDT(df), ID~rowid(ID), value.var = c('X', 'Y'))

#   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

数据

df <- structure(list(ID = c(1L, 1L, 2L, 3L, 3L), X = c("A", "B", "C", 
"A", "A"), Y = c("A", "A", "A", "K", "A")), 
class = "data.frame", row.names = c(NA, -5L))