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

如何在R语言中使用rowSums创建变量统计指定列的Yes出现次数

验证与优化:用dplyr统计指定变量中"Yes"的出现次数

需求:统计数据框中a1、a2、a3、a4四个变量每行里"Yes"的出现次数,以下是对现有代码的验证和优化建议:

原代码展示

library(dplyr)

set.seed(2022)
mydata <- tibble::tibble(
  "id" = 1:100,
  "a1" = sample(c(rep("Yes", 40), rep_len(NA, 100)), 100),
  "a2" = sample(c(rep("Yes", 50), rep_len(NA, 100)), 100),
  "a3" = sample(c(rep("Yes", 40), rep_len(NA, 100)), 100),
  "a4" = sample(c(rep("Yes", 50), rep_len(NA, 100)), 100),
  "b2" = rnorm(100, 50, 10)
)

# 目标:统计a*变量中"Yes"的出现次数
anymatch <- function(vars){
  rowSums(select(cur_data(), all_of(vars))=="Yes")
}

avars <- paste0("a", 1:4)

mydata %>% 
  mutate(afin = anymatch(avars)) %>% 
  select(avars, afin)

代码验证与问题点

原代码的核心逻辑是成立的:通过select(cur_data(), all_of(vars))筛选目标变量,用== "Yes"生成逻辑矩阵(TRUE对应"Yes",FALSE对应非"Yes",NA保留),再用rowSums求和得到每行"Yes"的数量。

但存在一个关键问题:当行内存在NA时,rowSums默认会返回NA,因为逻辑矩阵中的NA会导致求和结果无法计算,最终统计出的afin列会出现大量缺失值,无法得到准确的计数结果。

优化方案

只需在rowSums中添加na.rm = TRUE参数,忽略NA的影响(将NA视为非"Yes",不纳入计数):

anymatch <- function(vars){
  rowSums(select(cur_data(), all_of(vars)) == "Yes", na.rm = TRUE)
}

优化后再运行代码,afin列会正确显示每行中"Yes"的出现次数,不会再出现NA值。

补充说明

如果你的需求是判断每行是否存在至少一个"Yes"(而非统计次数),可以修改函数为:

anymatch <- function(vars){
  rowSums(select(cur_data(), all_of(vars)) == "Yes", na.rm = TRUE) > 0
}

此时afin会返回逻辑值TRUE/FALSE,标记该行是否包含"Yes"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:35:16