如何在data.table的更新连接中用env参数替代mget?
正确使用
env参数替代mget的实现方式 你之前的代码错误在于直接将字符串赋值给目标列,而非引用对应的i.前缀列,且env参数的用法不符合data.table的执行逻辑。以下是两种可行的正确实现:
方法一:结合.SD与.SDcols
library(data.table) X <- data.table(id = 1:5, L = letters[1:5]) Y <- data.table(id = 3:5, L = c(NA, "g", "h"), N = c(10, NA, 12)) ucols <- names(Y)[names(Y) %in% names(X)] X[Y, on = .(id), (ucols) := .SD, .SDcols = paste0("i.", ucols), env = list(ucols = ucols)]
方法二:用lapply+get引用列
library(data.table) X <- data.table(id = 1:5, L = letters[1:5]) Y <- data.table(id = 3:5, L = c(NA, "g", "h"), N = c(10, NA, 12)) ucols <- names(Y)[names(Y) %in% names(X)] X[Y, on = .(id), (ucols) := lapply(paste0("i.", ucols), get), env = list(ucols = ucols)]
逻辑说明
env参数的作用是向j表达式的执行环境注入变量,确保ucols能被正确解析;- 两种方法本质都是通过构造
i.前缀的列名,从连接的右表(Y)中提取对应列的值,赋值给左表(X)的匹配列,效果与mget(paste0("i.",ucols))完全一致。
内容的提问来源于stack exchange,提问作者Rooh
相关产品推荐
相关产品推荐

