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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:03:23