我正在尝试根据连接将列的子集从Y复制到X,其中列的子集是动态的
我可以非常轻松地识别列:names(Y)[grep("xxx", names(Y))]
但是当我尝试在j表达式中使用该代码时,它只给出了列名,而不是列的值。 .SD
和.SDcols
非常接近,但它们仅适用于x expression
。我正在尝试做这样的事情:
X[Y[names(Y)[grep("xxx", names(Y))] := .SD, .SDcols = names(Y)[grep("xxx", names(Y)), on=.(zzz)]
是否有一组适用于.SD
的{{1}}和.SDcols
构造?或者,我是否需要为i expression
和j expression
字符串构建字符串?
答案 0 :(得分:3)
也许这会帮助您入门:
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"]
正如弗兰克在评论中指出的那样,使用i.
为列名添加前缀可能更安全,以确保指定的列确实来自Y
:
X[Y, (cols) := mget(paste0("i.", cols)), on = "id"]