首页 > 解决方案 > 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

但这可能不是最佳/理想的。

标签: rdata.tabletidyr

解决方案


您可以使用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

推荐阅读