将列表列表传递给data.table的CJ作为向量

时间:2016-01-12 17:45:15

标签: r data.table cross-join

我有以下代码:

main_cols <- c('num', 'let')
dt <- data.table(num = 1:5, let = letters[1:5])
dt

new_dt <- dt[CJ(num = num
                , let = let
                , unique = TRUE)
             , on = main_cols
             ]
head(new_dt, 10)

问题是:我想将列作为向量传递给交叉连接。如何在main_cols函数中“解包”CJ?感谢。

1 个答案:

答案 0 :(得分:7)

我认为你想要使用do.call,正如@AnandaMahto建议的那样:

m = dt[, do.call(CJ, .SD), .SDcols=main_cols]
dt[m, on=main_cols]

你也可以这样创建m

m = do.call(CJ, dt[,main_cols,with=FALSE])

如果列中包含重复值,请使用unique选项CJ

m = dt[, do.call(CJ, c(.SD, unique=TRUE)), .SDcols=main_cols]
# or 
m = do.call(CJ, c(dt[,main_cols,with=FALSE], unique=TRUE))