R语言:统计数据框各列中NA与-99的出现次数
问题分析
你写的sum(-99)是直接对常量-99求和,没有做元素级别的匹配判断,所以得到的结果完全不符合预期。正确的逻辑应该是先判断每列的每个元素是否等于-99,再对生成的逻辑值(TRUE记为1,FALSE记为0)求和。
另外要注意:你的数据框中dogs列因混合了数值和字符,R自动将其转为字符型,所以这里的-99实际是字符串"-99";cats列是纯字符型,不存在-99。
解决方案
1. 单独统计每列的-99出现次数
针对字符型列的"-99"进行判断,同时用na.rm = TRUE排除NA对求和的干扰:
df %>% summarise_all(~ sum(. == "-99", na.rm = TRUE))
运行结果:
cats dogs 0 2
2. 同时统计NA和-99的出现次数
如果想一次性得到每列的两种统计结果,可以结合列表返回:
df %>% summarise_all(list( na_count = ~ sum(is.na(.)), minus99_count = ~ sum(. == "-99", na.rm = TRUE) ))
运行结果:
cats_na_count cats_minus99_count dogs_na_count dogs_minus99_count 1 2 0 1 2
3. 针对数值型列的补充
如果你的数据框中有纯数值型的列(其中的-99是数值而非字符串),只需将判断条件改为sum(. == -99, na.rm = TRUE)即可。
内容的提问来源于stack exchange,提问作者nrcombs
相关产品推荐
相关产品推荐

