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

如何在dplyr函数中通过正则表达式选择列进行计算?

用正则表达式在dplyr中选择列计算非NA值总数

这里有两种可行的方案,不用手动列写所有含'a'的列:

方案1:直接用c_across()匹配正则列

利用c_across()结合matches()正则匹配,一次性选中所有列名包含指定字符的列,再合并计算非NA值数量:

library(dplyr)

set.seed(1)
col_of_interest <- 'a'
df <- 
  data.frame(
    id=rep(1:2, each=5),
    a1=rnorm(10),
    a2=c(NA, NA, NA, rnorm(7)),
    b1=rnorm(10)
  )

df %>% 
  group_by(id) %>% 
  reframe(value_count = length(na.omit(c_across(matches(col_of_interest)))))

matches(col_of_interest)会自动匹配所有列名包含'a'的列,c_across()将这些列按行拼接成向量,后续的na.omit()和length()就能统计每组的非NA总数量。

方案2:先重构数据(转窄格式)

如果觉得宽格式下的列选择逻辑不够直观,可以先把数据转成窄格式,再统计:

library(dplyr)
library(tidyr)

set.seed(1)
col_of_interest <- 'a'
df <- 
  data.frame(
    id=rep(1:2, each=5),
    a1=rnorm(10),
    a2=c(NA, NA, NA, rnorm(7)),
    b1=rnorm(10)
  )

df %>%
  pivot_longer(cols = matches(col_of_interest), names_to = "col_name", values_to = "value") %>%
  group_by(id) %>%
  reframe(value_count = sum(!is.na(value)))

pivot_longer()把所有含'a'的列转成col_name和value的键值对,之后直接用sum(!is.na(value))就能统计每组的非NA值总数,这种方式逻辑更清晰,后续如果要对这些列做其他分析也更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:15:01