data.table 连接中 i 表达式的 .SD 和 .SDcols

Eth*_*han 4 join r data.table

我正在尝试根据联接将列的子集从 Y 复制到 X,其中列的子集是动态的

我可以很容易地识别列:names(Y)[grep("xxx", names(Y))] 但是当我尝试在 j 表达式中使用该代码时,它只给出列名称,而不是列的值。和非常接近,但它们仅适用.SD于. 我正在尝试做这样的事情:.SDcolsx expression

X[Y[names(Y)[grep("xxx", names(Y))] := .SD, .SDcols = names(Y)[grep("xxx", names(Y)), on=.(zzz)]

是否存在适用于 的等效集合.SD.SDcols构造i expressionj expression或者,我是否需要为该字符串建立一个字符串eval

tal*_*lat 5

也许这会帮助您开始:

library(data.table)
X <- as.data.table(mtcars[1:5], keep.rownames = "id")
Y <- as.data.table(mtcars, keep.rownames = "id")
cols <- c("gear", "carb")

# copy cols from Y to X based on common "id":
X[Y, (cols) := mget(cols), on = "id"]
Run Code Online (Sandbox Code Playgroud)

正如 Frank 在他的评论中指出的那样,在列名称前添加前缀可能更安全,i.以确保分配的列确实来自Y

X[Y, (cols) := mget(paste0("i.", cols)), on = "id"]
Run Code Online (Sandbox Code Playgroud)