NA数量少于指定值时如何计算行均值?问卷求和代码优化求助
问卷数据行求和/求均值的优雅实现
一、优化行求和(sumscore)的代码
你原来的代码可以合并为单次mutate操作,省去中间变量和多次数据框赋值,逻辑更紧凑:
library(tidyverse) dum <- tibble(x=c(1,NA,2,3,4),y=c(1,2,3,NA,5),z=c(1,NA,2,3,4)) # 设定允许的最大NA数量(这里设为1,即NA数量<2时计算求和) max_na <- 1 dum <- dum %>% mutate( sumscore = case_when( rowSums(is.na(select(., x:z))) <= max_na ~ rowSums(select(., x:z), na.rm = TRUE), .default = NA_real_ ) )
这样直接通过rowSums(is.na(...))判断NA数量,符合条件时计算行和,否则直接赋值NA,不需要用临时值中转,代码更简洁直观。
如果想进一步简化,还可以用ifelse替代case_when(逻辑简单时更紧凑):
dum <- dum %>% mutate( sumscore = ifelse( rowSums(is.na(select(., x:z))) <= max_na, rowSums(select(., x:z), na.rm = TRUE), NA_real_ ) )
二、NA数量符合要求时计算行均值
逻辑和求和完全一致,把rowSums换成rowMeans即可:
# 同样设定允许的最大NA数量 max_na <- 1 dum <- dum %>% mutate( mean_score = case_when( rowSums(is.na(select(., x:z))) <= max_na ~ rowMeans(select(., x:z), na.rm = TRUE), .default = NA_real_ ) )
或者用ifelse版本:
dum <- dum %>% mutate( mean_score = ifelse( rowSums(is.na(select(., x:z))) <= max_na, rowMeans(select(., x:z), na.rm = TRUE), NA_real_ ) )
另外,如果你的问卷问题列有统一命名规则(比如都是以q_开头),可以用select(., starts_with("q_"))替代x:z,代码扩展性更强,不用手动列变量名。
内容的提问来源于stack exchange,提问作者Gitta
相关产品推荐
相关产品推荐

