R 将长柱重塑为宽柱,添加其他柱

R 将长柱重塑为宽柱,添加其他柱,r,data.table,reshape,R,Data.table,Reshape,我有一个如下所示的数据帧: 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

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

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和变量分组,这样它们才有意义 然后将该表转换为宽表,将ID保留为列,将新变量保留为列标题。您删除了列变量,因为您已经在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))