如何使用dplyr按行计算指定前缀列的均值?
按指定前缀列计算行均值的实现方案
原始数据集
生成数据集的R代码:
set.seed(12345) df <- data.frame(a1 = rnorm(5), a2 = rnorm(5), a3 = rnorm(5), b1 = rnorm(5), b2 = rnorm(5), b3 = rnorm(5), c1 = rnorm(5), c2 = rnorm(5), c3 = rnorm(5))
数据集内容:
a1 a2 a3 b1 b2 b3 c1 c2 c3 1 0.5855288 -1.8179560 -0.1162478 0.8168998 0.7796219 1.8050975 0.8118732 0.49118828 1.1285108 2 0.7094660 0.6300986 1.8173120 -0.8863575 1.4557851 -0.4816474 2.1968335 -0.32408658 -2.3803581 3 -0.1093033 -0.2761841 0.3706279 -0.3315776 -0.6443284 0.6203798 2.0491903 -1.66205024 -1.0602656 4 -0.4534972 -0.2841597 0.5202165 1.1207127 -1.5531374 0.6121235 1.6324456 1.76773385 0.9371405 5 0.6058875 -0.9193220 -0.7505320 0.2987237 -1.5977095 -0.1623110 0.2542712 0.02580105 0.8544517
需求说明
给定前缀向量(示例:cols <- c("a", "c")),按行计算对应前缀列(如a1/a2/a3、c1/c2/c3)的均值,输出包含这些均值的DataFrame,期望结果:
a c 1 -0.449558319 0.8105241 2 1.052292204 -0.1692037 3 -0.004953185 -0.2243752 4 -0.072480153 1.4457733 5 -0.354655514 0.3781747
解决方案
方法1:tidyverse工具链(高效适配动态前缀)
利用purrr::map_dfc遍历前缀向量,结合dplyr::select筛选指定前缀列,再用rowMeans计算行均值,最后自动合并为DataFrame:
library(tidyverse) cols <- c("a", "c") result <- map_dfc(cols, ~ df %>% select(starts_with(.x)) %>% rowMeans()) %>% set_names(cols) print(result)
方法2:base R原生实现
通过正则匹配列名前缀,循环计算每个前缀对应的行均值并组装结果:
cols <- c("a", "c") result <- data.frame() for(prefix in cols) { # 匹配以当前前缀开头的列 prefix_cols <- grep(paste0("^", prefix), names(df)) result[[prefix]] <- rowMeans(df[, prefix_cols]) } print(result)
方法3:dplyr rowwise + c_across(适合理解行操作逻辑)
如果需要用rowwise实现,可结合c_across指定列范围后计算均值,适合小数量前缀的场景:
library(dplyr) cols <- c("a", "c") result <- df %>% rowwise() %>% mutate( a = mean(c_across(starts_with("a"))), c = mean(c_across(starts_with("c"))) ) %>% ungroup() %>% select(all_of(cols)) print(result)
内容的提问来源于stack exchange,提问作者nico
相关产品推荐
相关产品推荐

