首页 > 解决方案 > 将具有一个 id 和一个变量列的 data.table 转换为存在矩阵

问题描述

我有一个具有以下结构的 data.table:

num_id  value
1000    A1
1001    A1
1000    A2
1000    A3
1001    A54
1002    A55
1001    A100

并想把它变成形式的 dt

num_id A1        A2       A3       A54       A55       A100
1000   1         1        1        0         0         0
1001   1         0        0        1         0         1
1002   0         0        0        0         1         0

我认为这很容易使用dcast。浮现在脑海中的公式是dcast(dt, numid~value)抱怨的Cross product of elements provided to CJ() would result in 4850158203 rows which exceeds .Machine$integer.max == 2147483647。这超过了预期的行数,因为我有大约 500,000 个唯一 ID。在较小的数据表上运行测试后,似乎调用dcast将 ID 保持原样,将值列替换为只有 1 个元素不为空的列向量。这没有多大帮助,因为缺少必要的聚合/分组步骤。

我编写了以下代码,该代码有效,但速度慢且令人费解。有没有办法在单个 dcast 调用中做到这一点?

futurecolumns=unique(dt$value)
aggregated=dt[,list(list(value)), by=num_id]
out=t(sapply(aggregated$V1, function(x){futurecolumns %in% x}))
out=as.data.table(out*1)
out$num_id=aggregated$num_id
setnames(out, c(futurecolumns, "num_id"))

标签: rdata.tablereshape2

解决方案


Base R 1 混淆表达式:

aggregate(. ~ num_id,
          data.frame(num_id = df$num_id,
                     +sapply(unique(df$value), `==`, df$value)), sum)

推荐阅读