R data.table - 将单个 ID 的多个组转换为多个列
R data.table - dcast multiple groups for single ID into multiple columns
当 dcast
ing 一个 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 的 U
和 V
列中附加了 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。
请帮忙
也许在 dcast
ing 之前创建唯一列是一种选择?
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
当 dcast
ing 一个 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 的 U
和 V
列中附加了 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。
请帮忙
也许在 dcast
ing 之前创建唯一列是一种选择?
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