问题描述
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
保留为一列,并将新变量保留为列标题。您删除了列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","K","A")),class = "data.frame",row.names = c(NA,-5L))