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))