data.table是否有类似dplyr的数据代词?如何区分外部变量与列名?
在data.table中区分列名与外部变量(替代dplyr的.env效果)
当data.table的列名与外部变量同名时,可通过以下几种方式明确指定使用外部变量,实现类似dplyr中.env代词的效果:
方法1:使用..前缀
data.table里的..前缀用于指示从上层环境(而非data.table本身)查找变量,是区分列名和外部变量最简洁的方式:
animalDf <- data.frame( animal = c("snail", "spider", "bear"), legs = c(0, 8, 4) ) animal <- "spider" animalDt <- data.table::as.data.table(animalDf) # 用..前缀指定外部变量animal animalDt[animal == ..animal, legs] # 输出:8
方法2:使用.env代词
从data.table 1.14.0版本开始,官方支持.env代词,用法和dplyr完全一致,直接引用外部环境变量:
animalDt[animal == .env$animal, legs] # 输出:8
方法3:用get()指定环境(繁琐,不推荐)
如果需要更明确地指定变量所在环境,可以使用get()函数,指定目标环境(比如全局环境或函数的上层环境):
animalDt[animal == get("animal", envir = parent.frame()), legs] # 输出:8
函数中的适配场景
当你在函数中无法控制data.table的列名时,上述方法同样能避免变量混淆:
get_animal_legs <- function(dt, target_animal) { # 用..前缀引用函数参数(外部变量) dt[animal == ..target_animal, legs] } get_animal_legs(animalDt, "spider") # 输出:8
内容的提问来源于stack exchange,提问作者Noskario
相关产品推荐
相关产品推荐

