data.table原地替换执行正常但返回值为NULL的问题咨询
问题原因 & 解决方案
嘿,这个问题我太熟了!你遇到的test_dt1变成NULL的原因很简单——你的replaceNABlank函数没有返回值!
为什么会这样?
data.table的set()函数是原地修改(直接操作传入的data.table对象本身,不会复制新对象),所以你在函数内部用print(DT)能看到修改后的结果,但函数执行完默认会返回NULL,你把这个NULL赋值给test_dt1,那它自然就是空的了。
解决方案1:让函数返回修改后的data.table
只需要在函数末尾加上return(DT),这样调用函数时就能拿到处理后的结果:
replaceNABlank <- function(DT, cols) { for (j in cols) set(DT, which(is.na(DT[[j]])), j, '') print(DT) return(DT) # 新增返回语句,把修改后的DT返回出去 }
这样再执行test_dt1 <- replaceNABlank(test_dt, to_quote),test_dt1就会是处理后的data.table了。
解决方案2:利用data.table原地修改的特性,不用赋值
因为set()是直接修改原对象,你其实不需要创建新变量test_dt1,调用函数后原test_dt已经是处理好的结果了:
replaceNABlank(test_dt, to_quote) # 此时直接查看test_dt,就是修改后的内容
额外优化:更简洁的写法(不用单独写函数)
其实可以不用循环和自定义函数,直接用data.table的语法一次性处理:
test_dt[, (to_quote) := lapply(.SD, function(x) { x[is.na(x)] <- '' x }), .SDcols = to_quote]
这样一行代码就能完成所有非数值/逻辑列的NA替换,效率也更高。
内容的提问来源于stack exchange,提问作者abhiieor
相关产品推荐
相关产品推荐

