如何实现全缺失值行求和为NA,否则累加非缺失值?
解决方案
要实现你的需求,我们可以通过判断每行是否全为缺失值,再结合行求和来得到结果:
- 当整行所有值都是
NA时,求和结果设为NA - 当行中至少有一个非缺失值时,累加所有非缺失值
Base R 实现代码
values1 <- c(1,2,NA,NA,NA,NA,2,3) values2 <- c(1,2,NA,4,NA,NA,2,3) values3 <- c(1,2,NA,4,5,NA,2,3) df <- data.frame(values1,values2,values3) # 计算每行的非缺失值数量,根据数量判断求和逻辑 df$tot <- ifelse( rowSums(!is.na(df[, c('values1','values2','values3')])) == 0, # 判断是否整行全为NA NA, # 全NA则返回NA rowSums(df[, c('values1','values2','values3')], na.rm = TRUE) # 否则累加非缺失值 ) df
代码逻辑解释
rowSums(!is.na(df[, ...])):统计每行的非缺失值个数,结果为0时表示整行都是NAifelse()函数根据上述判断结果,分别返回NA或行求和结果(rowSums加na.rm=TRUE忽略缺失值求和)
运行后得到的结果中,第3行和第6行(整行全NA)的tot列会显示为NA,其他行则正常累加非缺失值。
可选:dplyr 风格实现
如果你习惯使用tidyverse工具链,也可以用行级操作实现:
library(dplyr) df <- df %>% rowwise() %>% mutate( tot = if(all(is.na(c(values1, values2, values3)))) { NA } else { sum(c(values1, values2, values3), na.rm = TRUE) } ) %>% ungroup()
内容的提问来源于stack exchange,提问作者Log On
相关产品推荐
相关产品推荐

