【问题标题】:Reshape long to wide adding additional columns [duplicate]将长整形为宽添加额外的列[重复]
【发布时间】:2021-05-03 21:43:42
【问题描述】:

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

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

【问题讨论】:

    标签: r data.table reshape


    【解决方案1】:
    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 中对其进行了编码。

    【讨论】:

      【解决方案2】:

      我们可以使用rowid 创建一个唯一的 ID,您可以通过该 ID 将数据转换为 Wide。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多