R语言按行统计b至c列非NA值个数(优先tidyverse实现)
R中按行统计b到c列非NA值个数(tidyverse实现)
需求说明
针对示例数据集,按行统计从列b到列c范围内的非NA值个数,在原数据集基础上新增列存储统计结果,期望统计值按行依次为:1、1、2、1、2、1。
示例原始数据:
library(tidyverse) d = tibble(a = c("Tom", "Mary", "Ben", "Jane", "Lucas", "Mark"), b = c(NA, 3, 6, NA, 5, NA), c = c(2, NA, 6, 7, 1, 9)) d

实现方案
方案1:行式操作写法(可读性强,适合小数据量)
使用rowwise()开启行式运算,搭配c_across()选中连续列范围,直接统计非NA值数量:
d %>% rowwise() %>% mutate(non_na_count = sum(!is.na(c_across(b:c)))) %>% ungroup()
代码说明:c_across(b:c)会按数据集列顺序选中b到c的所有列,is.na()判断缺失值后取反得到非NA的逻辑向量,sum()对逻辑值求和(TRUE记为1,FALSE记为0)即得到每行非NA值个数,最后用ungroup()解除行式分组,避免影响后续操作。
方案2:向量化写法(性能优异,适合大数据量)
如果数据集行数较多,优先使用向量化的rowSums()计算,无需逐行遍历,运行速度更快:
d %>% mutate(non_na_count = rowSums(!is.na(pick(b:c))))
代码说明:pick(b:c)用于选中b到c的连续列,生成对应子数据框,!is.na()将子数据框转为逻辑矩阵,rowSums()直接按行对逻辑值求和得到统计结果,全程为向量化运算,性能远高于行式遍历写法。
两种方案运行后输出结果完全一致,新增的non_na_count列值均为1,1,2,1,2,1,符合预期。
内容的提问来源于stack exchange,提问作者st4co4
相关产品推荐
相关产品推荐

