R data.table封装函数时传入的输入列引用无法识别问题
问题根因
data.table的语法规则中,只有j位置(也就是赋值、计算列的位置)用()包裹变量时,会自动解析变量存储的字符串作为列名;但i位置(行筛选/条件判断位置)不会做这个自动解析,你直接写in_c < 20时,程序会尝试寻找名为in_c的列,而不是读取in_c变量存储的字符串对应的目标列,因此触发列不存在的报错。你写输出列时用了(out_c)的写法符合j位置的解析规则,所以输出列可以正常识别。
修复代码
方案1:保留原有链式判断逻辑,用get()解析字符串列名
在i位置的所有条件判断中,用get(in_c)获取传入参数对应的实际列值即可:
library(data.table) mmfun <- function(dt, in_c, out_c) { dt[get(in_c) < 20, (out_c) := 1][ get(in_c) >= 20 & get(in_c) < 30, (out_c) := 2 ][ get(in_c) >= 30 & get(in_c) < 40, (out_c) := 3 ][ get(in_c) >= 40, (out_c) := 4 ] } # 测试 c1 = data.table( min_age = c(18, 28, 30), max_age = c(19, 31, 41) ) mmfun(c1, "min_age", "min_age_dec") mmfun(c1, "max_age", "max_age_dec") head(c1)
方案2:用分箱函数简化代码(推荐)
逐行写区间判断冗余且容易写错,直接用cut()函数一次完成年龄分箱,逻辑和你的需求完全一致(左闭右开区间匹配十年段分组):
mmfun <- function(dt, in_c, out_c) { dt[, (out_c) := as.integer(cut( get(in_c), breaks = c(-Inf, 20, 30, 40, Inf), right = FALSE ))] }
两种方案运行结果和你直接写裸链式操作的输出完全一致:
min_age max_age min_age_dec max_age_dec 1: 18 19 1 1 2: 28 31 2 3 3: 30 41 3 4
内容的提问来源于stack exchange,提问作者steadww
相关产品推荐
相关产品推荐

