微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重塑长到宽添加额外的列

如何解决重塑长到宽添加额外的列

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。