R data.table - 将单个 ID 的多个组转换为多个列

R data.table - dcast multiple groups for single ID into multiple columns

dcasting 一个 data.table 时,如果一个 id 属于多个类别/字段,它默认 returns 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对应的不超过一个类别,那么它returns只有实际值本身。我在示例 table 的 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 的多个组会生成多个包含实际值的列 - 而不是 length 的类别ID。

请帮忙

也许在 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[, 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