首页 > 解决方案 > R data.table - 将单个 ID 的多个组转换为多个列

问题描述

dcasting 一个 data.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 对应的类别不超过一个,那么它只会返回实际值本身。我在示例表中添加了 1UV列来演示这一点。

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 的多个组会生成多个列,其中包含实际值——而不是lengthid 的类别。

请帮忙

标签: rdata.tablereshapemeltdcast

解决方案


你也可以这样做:

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

推荐阅读