如何在R语言中计算含NA的两列均值(双列均为NA时返回NA)
解决方案
你的代码存在两个问题:
- 列索引写法错误:
df_income_[,7,8]应该改为df_income[, c(7,8)](用c()包裹多个列索引,或用7:8表示连续列); 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
相关产品推荐
相关产品推荐

