如何解决创建所有交叉组合,尊重列层次结构
从我的 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'),test = sample(c('ONE','TWO','THREE','FOUR','FIVE','SIX','SEVEN'),replace = TRUE))
foo.1 <- DT.in[,.(new = CJ(lvl1,unique = TRUE))]
foo.2 <- DT.in[,code,unique = TRUE))]
foo.3 <- DT.in[,var,unique = TRUE))]
foo.4 <- DT.in[,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,以根据数字索引选择列 - 在
CJ
中应用do.call
- 使用
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。