r - 将具有一个 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"))
解决方案
Base R 1 混淆表达式:
aggregate(. ~ num_id,
data.frame(num_id = df$num_id,
+sapply(unique(df$value), `==`, df$value)), sum)
推荐阅读
- c++ - 获取鼠标按钮单击
- r - 如何使用我的颜色创建调色板并像“scale_fill_brewer”一样使用它?
- php - 即使请求验证失败,也继续使用 Controller
- sql-server - 运行 Liquibase 连接和更新 Azure SQL 数据库时登录失败
- javascript - 怎么老是刷新html音频
- sql - 在 Oracle 中按行选择
- python-3.x - 字符串替换:多行,特殊字符不区分大小写
- scala - 如果 A 的泛型子类型被声明为返回参数,为什么我不能返回 A 的具体子类型?
- qt - 将动画应用于 InputPanel QML 类型的问题
- javascript - 如何在 NodeJS 中删除事件监听器?