将列列表作为向量传递给 data.table 的 CJ
Pass a list of columns to data.table’s CJ as a vector
我有以下代码:
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)
问题是:我想将要交叉连接的列作为向量传递。如何在 CJ
函数中“解压”main_cols
?谢谢
我想你会想要使用 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))
我有以下代码:
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)
问题是:我想将要交叉连接的列作为向量传递。如何在 CJ
函数中“解压”main_cols
?谢谢
我想你会想要使用 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))