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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:15:39