如何在R语言中统计多列中“No”的出现次数
统计每行多列中"no"的出现次数
给定如下R数据集:
id = c(1,2,3,4,5,6,7,8) trat = c("a","b","a","b","a","b","a","b") var1 = c("no","no","no","no","yes",NA,NA,"no") var2 = c("yes","yes","no","no","yes","no",NA,"no") df = data.frame(id,trat,var1,var2)
需要为每行统计var1和var2列中"no"的出现次数,生成count_no列,最终得到目标结果。
以下是几种可行的实现方法:
方法1:使用dplyr(tidyverse)
适合代码可读性高的场景,处理大型数据集也高效:
library(dplyr) df <- df %>% rowwise() %>% mutate(count_no = sum(c_across(var1:var2) == "no", na.rm = TRUE)) %>% ungroup()
rowwise()指定按行计算c_across(var1:var2)选中需要统计的列sum(..., na.rm = TRUE)统计"no"的数量,忽略NA值
方法2:使用base R
无需加载额外包,代码简洁:
df$count_no <- rowSums(df[, c("var1", "var2")] == "no", na.rm = TRUE)
df[, c("var1", "var2")] == "no"生成逻辑矩阵,匹配到"no"的位置为TRUErowSums(..., na.rm = TRUE)按行求和,TRUE对应1,FALSE和NA忽略
方法3:使用data.table(适合超大型数据集)
处理百万级以上数据时速度更优:
library(data.table) setDT(df) df[, count_no := rowSums(.SD == "no", na.rm = TRUE), .SDcols = c("var1", "var2")]
setDT(df)将数据框转换为data.table格式.SDcols指定需要统计的列,.SD代表这些列的子集rowSums(...)按行统计"no"的数量
运行任意一种方法后,都能得到你期望的结果:
id trat var1 var2 count_no 1 1 a no yes 1 2 2 b no yes 1 3 3 a no no 2 4 4 b no no 2 5 5 a yes yes 0 6 6 b <NA> no 1 7 7 a <NA> <NA> 0 8 8 b no no 2
内容的提问来源于stack exchange,提问作者Plinio Leal
相关产品推荐
相关产品推荐

