如何在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
相关产品推荐
相关产品推荐

