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

如何在R语言中计算含NA的两列均值(双列均为NA时返回NA)

解决方案

你的代码存在两个问题:

  1. 列索引写法错误:df_income_[,7,8]应该改为df_income[, c(7,8)](用c()包裹多个列索引,或用7:8表示连续列);
  2. rowMeans(..., na.rm=TRUE)在两列全为NA时会返回NaN,而非你需要的NA,需额外处理该情况。

以下是几种可行的解决方案,以你提供的示例数据为例:

方法一:修正rowMeans并转换NaN为NA

这种方法贴近你原本的思路,先计算行均值,再将结果中的NaN替换为NA:

library(dplyr)

wave_1 <- data.frame(ID=c(1, 2, 3, 4, 5, 6),
                     income_wave_1=c(100, 100, 50, NA, 60, 100),
                     income_wave_2=c(NA, 120, 60,  NA, 100, 100))

wave_final <- wave_1 %>%
  mutate(average = rowMeans(select(., income_wave_1, income_wave_2), na.rm = TRUE)) %>%
  mutate(average = na_if(average, NaN))

若用第7、8列计算,只需把select(., income_wave_1, income_wave_2)替换为select(., 7:8)即可。

方法二:用rowwise()+mean()实现

逐行计算均值,逻辑更直观:

wave_final <- wave_1 %>%
  rowwise() %>%
  mutate(average = mean(c(income_wave_1, income_wave_2), na.rm = TRUE)) %>%
  mutate(average = na_if(average, NaN)) %>%
  ungroup()

方法三:先判断全NA再计算均值

先判断目标两列是否全为NA,再决定赋值逻辑:

wave_final <- wave_1 %>%
  mutate(
    average = case_when(
      is.na(income_wave_1) & is.na(income_wave_2) ~ NA_real_,
      TRUE ~ rowMeans(select(., income_wave_1, income_wave_2), na.rm = TRUE)
    )
  )

以上方法均可生成你需要的结果,其中ID=4的行average值为NA,其余行符合预期均值。

内容的提问来源于stack exchange,提问作者Max Herre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:55:20