R语言data.table替换因子列0、128为NA后原水平未消失的问题求助
解决data.table中因子列替换值并移除无用水平的问题
你之前的操作思路存在问题,直接修改levels()数组的元素无法实现替换值并移除水平的效果,原因如下:
- 因子的内部存储是编码值,
val$LU1945 == 0比较的是编码而非显示的因子值,大概率没匹配到正确位置; - 就算修改了levels的元素,也只是改变水平名称,不会将数据中的对应值转为NA,原水平依然会保留。
针对大型data.table的高效处理,正确步骤如下:
1. 将指定因子值替换为NA
利用data.table的:=操作符直接更新列,匹配因子的显示值(注意是字符串格式,因为你的levels输出是"0"、"128"):
# 匹配"0"和"128"对应的因子值,设为NA val[LU1945 %in% c("0", "128"), LU1945 := NA]
2. 移除未被使用的因子水平
用droplevels()清理无用水平,用data.table语法实现:
val[, LU1945 := droplevels(LU1945)]
验证结果
执行完上述两步后,再调用levels(val$LU1945),就能看到"0"和"128"已经被移除了。
内容的提问来源于stack exchange,提问作者BHope
相关产品推荐
相关产品推荐

