You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中处理含NA/9的行统计与过滤(na.rm问题)

问题解决方法

核心问题分析

  1. nine.num出现NA的原因:当单元格值为NA时,==9的判断结果是NA,rowSums默认会保留NA,导致整行的nine.num变成NA。必须在rowSums中添加na.rm=TRUE来忽略这些NA值,只统计明确等于9的数量。
  2. 过滤代码失效的原因:你用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:35:29