如何在R中统计数据集中每个ID对应变量的"Yes"数量
统计每行"Yes"数量并新增Count列的R实现
嘿,这事儿简单得很,给你两种常用的R实现方法,你看哪种顺手就用哪种:
第一步:先构造你的示例数据集
先把你给出的数据转换成R里可操作的data.frame:
df <- data.frame( ID = 1:7, Var1 = c("Yes", "No", "Yes", "No", "No", "No", "Yes"), Var2 = c("No", "No", "Yes", "No", "Yes", "No", "Yes"), Var3 = c("Yes", "No", "Yes", "No", "Yes", "Yes", "No"), Var4 = c("No", "No", "Yes", "No", "No", "No", "No"), Var5 = c("No", "No", "No", "No", "No", "No", "No"), Var6 = c("Yes", "No", "Yes", "No", "Yes", "Yes", "No"), stringsAsFactors = FALSE # 避免自动转成因子,方便后续比较 )
方法一:基础R原生方法(无需额外包)
用rowSums函数直接统计每行中等于"Yes"的元素个数,简单高效:
# 选中Var1到Var6的列,判断是否为"Yes",再对每行求和 df$Count <- rowSums(df[, paste0("Var", 1:6)] == "Yes")
解释:paste0("Var", 1:6)自动生成Var1到Var6的列名,选中这些列后和"Yes"比较会得到一个布尔矩阵,rowSums会对每行的TRUE(即"Yes")计数求和。
方法二:tidyverse/dplyr方法(代码更直观)
如果你平时习惯用tidyverse系列工具,可以用dplyr的函数来实现:
# 先加载dplyr包 library(dplyr) # 方法2.1:用rowwise + c_across逐行计算 df <- df %>% rowwise() %>% mutate(Count = sum(c_across(Var1:Var6) == "Yes")) %>% ungroup() # 记得取消逐行模式,避免后续操作变慢 # 方法2.2:更高效的rowSums + across版本(适合大数据集) df <- df %>% mutate(Count = rowSums(across(Var1:Var6) == "Yes"))
最终结果
运行任意一种方法后,你的数据集会新增Count列,结果如下:
print(df) # ID Var1 Var2 Var3 Var4 Var5 Var6 Count # 1 1 Yes No Yes No No Yes 3 # 2 2 No No No No No No 0 # 3 3 Yes Yes Yes Yes No Yes 5 # 4 4 No No No No No No 0 # 5 5 No Yes Yes No No Yes 3 # 6 6 No No Yes No No Yes 2 # 7 7 Yes Yes No No No No 2
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

