【问题标题】:R data.table - dcast multiple groups for single ID into multiple columnsR data.table - 将单个 ID 的多个组转换为多个列
【发布时间】:2020-01-08 23:54:25
【问题描述】:

dcastdata.table时,如果一个id属于多个类别/字段,默认返回length的值。

dta <- (data.table(ID = c("A", "C", "B", "A", "D", "D", "A", "B", "D", "D"), 
                   CATEGORY_DUPLICATE = c(LETTERS[17:23], LETTERS[20:22]),
                   CATEGORY_UNIQUE = c(LETTERS[17:23], c("T", "U.1", "V.1")), 
                   VALUE = c(400, 400, 500, 300, 500, 100, 200, 300, 400, 500)))

dcast(dta, ID ~ CATEGORY_DUPLICATE, value.var = "VALUE")

ID  Q   R   S   T   U   V   W
A   1   0   0   1   0   0   1
B   0   0   1   1   0   0   0
C   0   1   0   0   0   0   0
D   0   0   0   0   2   2   0

如果一个 id 对应的类别不超过一个,那么它只返回实际值本身。我在示例表的UV 列中附加了一个1 来说明这一点。

dcast(dta, ID ~ CATEGORY_UNIQUE, value.var = "VALUE")

ID  Q   R   S   T   U   U.1 V   V.1 W
A   400 NA  NA  300 NA  NA  NA  NA  200
B   NA  NA  500 300 NA  NA  NA  NA  NA
C   NA  400 NA  NA  NA  NA  NA  NA  NA
D   NA  NA  NA  NA  500 400 100 500 NA

我希望在 dcast 查询本身中实现此结果 - 这样一个 id 的多个组会生成多个包含实际值的列 - 而不是 id 类别的 length

请帮忙

【问题讨论】:

    标签: r data.table reshape melt dcast


    【解决方案1】:

    你也可以这样做:

    dcast(dta[, CATEGORY_UNIQUE := make.unique(CATEGORY_DUPLICATE), by = ID],
          ID ~ CATEGORY_UNIQUE, value.var = "VALUE")
    
       ID   Q   R   S   T   U U.1   V V.1   W
    1:  A 400  NA  NA 300  NA  NA  NA  NA 200
    2:  B  NA  NA 500 300  NA  NA  NA  NA  NA
    3:  C  NA 400  NA  NA  NA  NA  NA  NA  NA
    4:  D  NA  NA  NA  NA 500 400 100 500  NA
    

    【讨论】:

      【解决方案2】:

      也许在dcasting 之前创建唯一列是一种选择?

      dcast(
          dt[, CATEGORY_UNIQUE := paste0(CATEGORY, 1:.N), by = CATEGORY],
          ID ~ CATEGORY_UNIQUE, value.var = "VALUE")
      #   ID  Q1  R1  S1  T1  T2  U1  U2  V1  V2  W1
      #1:  A 400  NA  NA 300  NA  NA  NA  NA  NA 200
      #2:  B  NA  NA 500  NA 300  NA  NA  NA  NA  NA
      #3:  C  NA 400  NA  NA  NA  NA  NA  NA  NA  NA
      #4:  D  NA  NA  NA  NA  NA 500 400 100 500  NA
      

      样本数据

      library(data.table)
      dt <- (data.table(
          ID = c("A", "C", "B", "A", "D", "D", "A", "B", "D", "D"),
          CATEGORY = c(LETTERS[17:23], LETTERS[20:22]),
          VALUE = c(400, 400, 500, 300, 500, 100, 200, 300, 400, 500)))
      

      【讨论】:

      • 或者,我们可以这样做:dcast(dta, ID ~ CATEGORY_DUPLICATE + rowid(CATEGORY_DUPLICATE), value.var = 'VALUE')
      猜你喜欢
      • 2013-09-02
      • 1970-01-01
      • 2020-11-15
      • 2021-09-30
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      相关资源
      最近更新 更多