r - data.table 与 tidyr::expand_grid
问题描述
我有
XIa <- diag(1, 3)
colnames(XIa) <- rownames(XIa) <- c("a0", "a1", "a2")
XIb <- diag(1, 2)
colnames(XIb) <- rownames(XIb) <- c("b0", "b1")
XIc <- diag(1, 2)
colnames(XIc) <- rownames(XIc) <- c("c0", "c1")
tidyr::expand_grid
给我:
tidyr::expand_grid(as.data.frame(XIa), as.data.frame(XIb), as.data.frame(XIc))
# A tibble: 12 x 7
a0 a1 a2 b0 b1 c0 c1
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 0 0 1 0 1 0
2 1 0 0 1 0 0 1
3 1 0 0 0 1 1 0
4 1 0 0 0 1 0 1
5 0 1 0 1 0 1 0
6 0 1 0 1 0 0 1
7 0 1 0 0 1 1 0
8 0 1 0 0 1 0 1
9 0 0 1 1 0 1 0
10 0 0 1 1 0 0 1
11 0 0 1 0 1 1 0
12 0 0 1 0 1 0 1
如何使用 获得相同的结果data.table
?
显然,有这种方式:
dXIa <- data.table(XIa)
dXIb <- data.table(XIb)
dXIc <- data.table(XIc)
cbind(
dXIa[c(rep(1:3, each = 4))],
dXIb[c(rep(1:2, each = 2))],
dXIc[c(rep(1:2, len = 12))]
)
a0 a1 a2 b0 b1 c0 c1
1: 1 0 0 1 0 1 0
2: 1 0 0 1 0 0 1
3: 1 0 0 0 1 1 0
4: 1 0 0 0 1 0 1
5: 0 1 0 1 0 1 0
6: 0 1 0 1 0 0 1
7: 0 1 0 0 1 1 0
8: 0 1 0 0 1 0 1
9: 0 0 1 1 0 1 0
10: 0 0 1 1 0 0 1
11: 0 0 1 0 1 1 0
12: 0 0 1 0 1 0 1
但这可能不是最佳/理想的。
解决方案
您可以使用CJ
,但不能data.table
直接使用。使用此cjdt
答案中的功能,您可以执行 -
library(data.table)
dXIa <- data.table(XIa)
dXIb <- data.table(XIb)
dXIc <- data.table(XIc)
cjdt <- function(a,b){
cj = CJ(1:nrow(a),1:nrow(b))
cbind(a[cj[[1]],],b[cj[[2]],])
}
Reduce(cjdt, list(dXIa, dXIb, dXIc))
# a0 a1 a2 b0 b1 c0 c1
# 1: 1 0 0 1 0 1 0
# 2: 1 0 0 1 0 0 1
# 3: 1 0 0 0 1 1 0
# 4: 1 0 0 0 1 0 1
# 5: 0 1 0 1 0 1 0
# 6: 0 1 0 1 0 0 1
# 7: 0 1 0 0 1 1 0
# 8: 0 1 0 0 1 0 1
# 9: 0 0 1 1 0 1 0
#10: 0 0 1 1 0 0 1
#11: 0 0 1 0 1 1 0
#12: 0 0 1 0 1 0 1
推荐阅读
- python-3.x - 如何更新字典计数器?
- python-3.x - 通过部分关键python获取dict值
- java - 使用 VAADIN 填充文本字段时如何启用按钮
- git - 为什么 git diff 只使用选项 --cached?
- python - 如何从多个条形图中的图例中删除一个条形标签
- mqtt - 使用 NodeJS 在 mosquitto MQTT 和 EMQX 之间搭建桥梁
- linker - 未找到符号的版本节点
- dart - ngModel 不适用于 Angulardart 5 中的选择标签和类实例
- mysql - mySQL:从日期中减去月份并在 WHERE 子句中用作条件
- c++ - 减少构建 BigInt 类的内存占用