R data.table链式操作中如何引用链内的当前对象?
data.table链式操作中引用当前对象的通用方案
你可以根据自己使用的data.table版本选择以下两种无外部依赖的通用实现方式:
方案1:使用原生.THIS标识符(推荐,需data.table ≥ 1.14.3版本)
data.table从1.14.3版本开始内置了.THIS特殊标识符,可在方括号的i、j、by等任意子句中直接指代当前链式步骤的完整对象,无需引用外部变量,也不需要加载额外包。
代码示例:
library(data.table) dt = data.table(col1 = c(1,1,1,2,2,3), col2=10:15) # 链式操作中直接用.THIS引用当前表,无需依赖外部dt变量 dt[col1 < 3, # 第一步:过滤col1小于3的行 ][, .(agg1 = sum(col2)/sum(.THIS$col2)), # 直接用.THIS取当前全表的col2总和 by = col1 ]
你也可以直接把.THIS作为参数传入以data.frame/data.table为入参的自定义函数:
# 自定义函数示例,输入为表对象 calc_total <- function(df) sum(df$col2) dt[, .(col1, col2)][, .(total = calc_total(.THIS))]
方案2:配合magrittr管道的.占位符(兼容所有版本)
如果使用的是低于1.14.3的旧版本data.table,可以结合magrittr管道操作,用.指代管道传入的当前表对象:
library(data.table) library(magrittr) dt = data.table(col1 = c(1,1,1,2,2,3), col2=10:15) dt[col1 < 3, ] %>% .[, .(agg1 = sum(col2)/sum(.$col2)), by = col1]
注意事项
不要混淆.THIS/管道.和.SD:.SD指代的是by分组后的每个子数据集,而.THIS/.指代的是当前链式步骤的完整全量表,符合通用访问当前对象的需求。
内容的提问来源于stack exchange,提问作者anymous.asker
相关产品推荐
相关产品推荐

