创建所有交叉组合,尊重列层次结构
Create all cross combinations, respecting the column hierarchy
根据我的 data.table
DT.in,我想创建所有交叉连接组合,但不仅限于 CJ(_all_my_var_)
.
我需要执行这样的操作:
CJ(var1)
CJ(var1, var2)
CJ(var1, var2, var3)
...
这是我的代表:
library(data.table)
set.seed(999)
DT.in <- data.table(lvl1 = rep('AA', 200),
code = sample(c('D44', 'J21'), 200, replace = TRUE),
var = sample(c('Z3R', 'TR5', 'JKL', 'FR5', 'TFX'), 200, replace = TRUE),
test = sample(c('ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN'), 200, replace = TRUE))
foo.1 <- DT.in[, .(new = CJ(lvl1, unique = TRUE))]
foo.2 <- DT.in[, .(new = CJ(lvl1, code, unique = TRUE))]
foo.3 <- DT.in[, .(new = CJ(lvl1, code, var, unique = TRUE))]
foo.4 <- DT.in[, .(new = CJ(lvl1, code, var, test, unique = TRUE))]
DT.out <- rbindlist(list(foo.1, foo.2, foo.3, foo.4), fill = TRUE)
我的DT.out是我想要的,当然,我需要自动化这个,变量的名称和数量永远不会相同。而我还是做不到...
如有任何帮助,我们将不胜感激。
(也许还有其他方法可以从 DT.in 到 DT.out ...?)
我们可以使用 do.call
和 CJ
- 用
lapply
遍历 'DT.in' 的列序列
- 获取
seq
uence,根据数字索引 到select列
- 在
do.call
中应用CJ
- 将
list
中的输出数据集绑定到 rbindlist
中的单个数据集
library(data.table)
DT.out2 <- rbindlist(lapply(seq_along(DT.in), function(i)
do.call(CJ, c(DT.in[, seq(i), with = FALSE], unique = TRUE))), fill = TRUE)
setnames(DT.out2, paste0("new.", names(DT.out2)))
-检查 OP 的输出
identical(DT.out, DT.out2)
[1] TRUE
根据我的 data.table
DT.in,我想创建所有交叉连接组合,但不仅限于 CJ(_all_my_var_)
.
我需要执行这样的操作:
CJ(var1)
CJ(var1, var2)
CJ(var1, var2, var3)
...
这是我的代表:
library(data.table)
set.seed(999)
DT.in <- data.table(lvl1 = rep('AA', 200),
code = sample(c('D44', 'J21'), 200, replace = TRUE),
var = sample(c('Z3R', 'TR5', 'JKL', 'FR5', 'TFX'), 200, replace = TRUE),
test = sample(c('ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN'), 200, replace = TRUE))
foo.1 <- DT.in[, .(new = CJ(lvl1, unique = TRUE))]
foo.2 <- DT.in[, .(new = CJ(lvl1, code, unique = TRUE))]
foo.3 <- DT.in[, .(new = CJ(lvl1, code, var, unique = TRUE))]
foo.4 <- DT.in[, .(new = CJ(lvl1, code, var, test, unique = TRUE))]
DT.out <- rbindlist(list(foo.1, foo.2, foo.3, foo.4), fill = TRUE)
我的DT.out是我想要的,当然,我需要自动化这个,变量的名称和数量永远不会相同。而我还是做不到...
如有任何帮助,我们将不胜感激。
(也许还有其他方法可以从 DT.in 到 DT.out ...?)
我们可以使用 do.call
和 CJ
- 用
lapply
遍历 'DT.in' 的列序列
- 获取
seq
uence,根据数字索引 到select列
- 在
do.call
中应用 - 将
list
中的输出数据集绑定到rbindlist
中的单个数据集
CJ
library(data.table)
DT.out2 <- rbindlist(lapply(seq_along(DT.in), function(i)
do.call(CJ, c(DT.in[, seq(i), with = FALSE], unique = TRUE))), fill = TRUE)
setnames(DT.out2, paste0("new.", names(DT.out2)))
-检查 OP 的输出
identical(DT.out, DT.out2)
[1] TRUE