data.table报错:需用'on='参数指定连接列,求函数修正方案
问题解决:data.table动态提取列并修改的错误修复
错误原因分析
- 误用data.table索引语法:将列名字符向量放在了
[.data.table的行筛选参数(i位置),而提取列应放在列选择参数(j位置) - 代码存在语法错误:提取列的语句缺少闭合括号
- 动态列赋值方式不符合data.table规范,且错误使用字符串
"NA"代替R原生缺失值NA
修正后的函数代码
ex <- function(x, y){ state <- paste0(x, "_state") test1 <- paste0(x, "_test1") test2 <- paste0(x, "_test2") # 正确提取指定列:列向量放在j参数位置 temp <- dt[, c("ID", state, test1, test2)] # 使用data.table的动态列赋值语法,用get()获取动态列的值 temp[, (test1) := ifelse(get(state) >= y, get(test1), NA)] # 返回结果的前几行 head(temp) }
关键修正点说明
- 列提取语法修正:将
dt[c("ID", state, test1, test2)]改为dt[, c("ID", state, test1, test2)],明确指定要选择的列 - 动态列处理:
- 用
(test1)作为赋值目标,确保data.table识别这是一个列名变量 - 用
get(state)和get(test1)引用动态生成的列名,避免直接字符向量引用的语法问题
- 用
- 缺失值修正:把字符串
"NA"替换为R原生的NA,保证缺失值被正确识别 - 语法错误修复:补上提取列语句末尾缺失的闭合括号
测试调用
执行ex(x = "B", y= 0.2)即可正常运行,函数会:
- 从
dt中提取ID、B_state、B_test1、B_test2列 - 将
B_state >= 0.2的行保留B_test1原值,其余行设为NA - 返回处理后数据的前几行
内容的提问来源于stack exchange,提问作者user20137369
相关产品推荐
相关产品推荐

