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

在R语言中对多变量条件计数(统计yes值)及优化问题

统计每行中"yes"的数量:问题与解决方法

原始数据与需求

我们有如下数据框,需要统计每行中所有"yes"的数量:

have = data.frame(x1 = c("yes", "no", NA, "yes", "yes", "yes", NA, "no"),
                  x2 = c("no", "yes", "no", NA, "no", "yes", NA, NA),
                  x3 = c(NA, NA, NA, "yes", "yes", "yes", NA, "yes"),
                  x4 = c("no", "yes", "no", "no", "no", "no", NA, "no"),
                  x5 = c(NA, "no", "no", "no", "no", NA, NA, "no"))

# 期望得到的结果
want = data.frame(have,
                  count_yes = c(1, 2, 0, 2, 2, 3, 0, 1))

尝试代码

attempt = as.data.frame(
  have %>% 
    mutate(count_yes_all = str_count(x1, "yes", na.rm=TRUE) +
             str_count(x2, "yes", na.rm=TRUE) + 
             str_count(x3, "yes", na.rm=TRUE) + 
             str_count(x4, "yes", na.rm=TRUE) + 
             str_count(x5, "yes", na.rm=TRUE))
  )

疑问

  1. 如何处理NA值?
  2. 有20多个以"x"开头的变量,如何高效编写代码,避免重复多行?

解决方案

1. NA值的正确处理

你尝试中使用的str_count函数没有na.rm参数,这个参数会被忽略,导致NA参与加法运算时结果仍为NA。正确逻辑是先将每个元素判断是否等于"yes"(NA会被转为FALSE),再统计数量时通过na.rm=TRUE排除NA的影响。

2. 批量处理以"x"开头的变量

无需逐个列手动调用函数,用以下两种方法可以高效处理所有目标列:

方法一:rowwise() + c_across()(直观易读)

library(dplyr)

result <- have %>%
  rowwise() %>%
  mutate(count_yes = sum(c_across(starts_with("x")) == "yes", na.rm = TRUE)) %>%
  ungroup()
  • starts_with("x")自动匹配所有以"x"开头的列,适配任意数量的目标变量
  • == "yes"将每个元素转为逻辑值(TRUE表示是"yes",FALSE/NA表示不是)
  • sum(..., na.rm=TRUE)统计每行TRUE的数量,同时忽略NA

方法二:rowSums()(性能更优,适合大数据集)

result <- have %>%
  mutate(count_yes = rowSums(.data[starts_with("x")] == "yes", na.rm = TRUE))
  • .data[starts_with("x")]提取所有目标列,生成逻辑矩阵
  • rowSums()直接对每行求和,na.rm=TRUE忽略NA,运算效率比rowwise()更高

验证结果

运行以下代码确认结果与预期一致:

all.equal(result, want)
# 输出:TRUE

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:16:07