如何在R中处理含NA/9的行统计与过滤(na.rm问题)
问题解决方法
核心问题分析
nine.num出现NA的原因:当单元格值为NA时,==9的判断结果是NA,rowSums默认会保留NA,导致整行的nine.num变成NA。必须在rowSums中添加na.rm=TRUE来忽略这些NA值,只统计明确等于9的数量。- 过滤代码失效的原因:你用了
sum(na.num, nine.num),这是对整个列求和,不是每行的数值相加。正确的做法是直接对每行的na.num和nine.num做加法,再判断条件。
修正后的完整代码
peeps.23 <- longitudinal %>% select(final_id, year, all_of(schl.context)) %>% filter(year == 2023) %>% mutate( na.num = rowSums(is.na(select(., all_of(schl.context)))), nine.num = rowSums(select(., all_of(schl.context)) == 9, na.rm = TRUE), total_missing = na.num + nine.num ) %>% filter(total_missing < 5) # 移除总数≥5的行,留下总数<5的行
更简洁的写法(无需单独统计na.num和nine.num)
如果不需要保留na.num和nine.num这两个中间列,可以直接一步计算总数并过滤:
peeps.23 <- longitudinal %>% select(final_id, year, all_of(schl.context)) %>% filter(year == 2023) %>% mutate( total_missing = rowSums( is.na(select(., all_of(schl.context))) | select(., all_of(schl.context)) == 9, na.rm = TRUE ) ) %>% filter(total_missing < 5)
关键细节说明
- 替换
one_of为all_of:dplyr 1.0.0版本后,推荐用all_of来处理字符向量指定的列选择,one_of属于旧版语法。 na.rm=TRUE的作用:在rowSums中添加这个参数,会忽略计算过程中出现的NA值,确保统计结果为有效数值。- 过滤条件:因为你需要移除总数≥5的行,所以过滤时保留
total_missing <5的行即可。
内容的提问来源于stack exchange,提问作者Stuart
相关产品推荐
相关产品推荐

