You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:31:15