为何na.rm=TRUE无法移除数据集缺失值?如何使其生效?
问题解析与解决方案
关键差异:na.rm=TRUE 和 na.omit() 完全是两回事
na.rm=TRUE只是在计算统计量时临时跳过缺失值,不会对原数据集做任何修改,缺失值依然留在数据里。你用它跑summary,只是均值、中位数这些指标是忽略NA算出来的,但数据集本身的NA数量没变,所以summary结果里还是会显示有104个NA。na.omit(data)是直接删除数据集中所有包含NA的行,会生成一个没有缺失值的新数据集(或者覆盖原数据集),之后的所有操作都是基于这个干净的数据集,所以summary里看不到NA,统计量也和之前不一样——因为样本量少了那些含NA的行。
要移除数据集里的NA,你可以这么做
如果你想实现「移除缺失值」的效果(而不是只在计算时忽略),不需要依赖na.rm=TRUE,直接筛选掉有NA的行就行:
基础R写法
# 先把负值转成NA edu2018$mathtest[edu2018$mathtest < 0] <- NA # 筛选出mathtest列非NA的行,生成干净数据集 edu2018_clean <- edu2018[!is.na(edu2018$mathtest), ] # 查看结果 summary(edu2018_clean$mathtest)
dplyr包写法(更简洁)
如果你用dplyr,可以这样写:
library(dplyr) edu2018_clean <- edu2018 %>% mutate(mathtest = ifelse(mathtest < 0, NA, mathtest)) %>% filter(!is.na(mathtest)) summary(edu2018_clean$mathtest)
这样处理后,数据集里的NA就被彻底移除了,效果和你用na.omit()的结果一致(如果其他列没有缺失值的话)。
内容的提问来源于stack exchange,提问作者oioi
相关产品推荐
相关产品推荐

