R语言data.table按列位置指定第二列实现NA值零填充的函数编写问题
问题出在哪
原来的函数跑不通,是没搞清楚data.table里:=的解析规则:j位置里没被括号包起来的名字,会被data.table直接当成表内的列名去匹配,根本不会去找你函数里传进来的那个存列名的字符串变量variable,自然就改错列或者找不到列了。
正确实现
适配你现有传参逻辑的改法
只要在:=左边的variable外面套个圆括号,强制data.table去取变量里存的实际列名就行,完全兼容你用colnames(tab)[2]拿列名的用法:
impute = function(DT, variable) { DT[is.na(get(variable)), (variable) := 0] }
测试调用的流程就是你之前预想的那样:
library(data.table) # 构造测试表 tab = data.table(V1 = 1, var = NA, perc = NA) # 取第二列列名 variable = colnames(tab)[2] # 执行填充 impute(tab, variable)
运行完就能看到原表第二列的NA都被替换成0了。
针对“目标列永远是第二列”的简化写法
既然固定要填的就是第二列,连传参都能省掉,函数内部直接按位置取第二列的列名就行:
impute = function(DT) { target_col = names(DT)[2] DT[is.na(get(target_col)), (target_col) := 0] } # 直接调用就行 impute(tab)
小提示
- data.table的修改是按引用直接改原对象的,不需要把函数返回值再赋值回原表,多写
tab = impute(tab)这种步骤反而会平白多做内存拷贝,拖慢速度。
内容的提问来源于stack exchange,提问作者silbana
相关产品推荐
相关产品推荐

