在dplyr中按列位置汇总分组data.frame的均值是否可行?
当然可以实现!在dplyr里,你完全不需要依赖列名,直接通过列的位置索引就能对指定列执行分组汇总操作,刚好契合你“目标特征始终在第3列”的需求。
下面结合你的示例代码,给出几种实用的实现方式:
首先加载必要的包:
library(dplyr) library(tibble)
方式1:针对筛选后的数据集(第三列为目标列)
你的代码已经通过select(date, group, starts_with(parameter))得到了包含目标列的数据集,此时目标列是第3列,直接用across(3)指定列位置计算均值:
df <- tibble(date = rep(c("2017-01-01", "2017-01-02", "2017-01-03"), 2), group = rep(c("A", "B"), 3), temperature = runif(6, -10, 30), percipitation = runif(6, 0,5) ) parameter <- "perc" df1 <- df %>% select(date, group, starts_with(parameter)) %>% group_by(group) %>% summarise(avg_percipitation = mean(across(3), na.rm = TRUE)) # across(3)选中第3列
方式2:更简洁的单列位置引用
如果确定只需要对单列(第3列)计算均值,也可以直接用.[[3]]提取当前数据框的第3列,写法更紧凑:
df1 <- df %>% select(date, group, starts_with(parameter)) %>% group_by(group) %>% summarise(avg_percipitation = mean(.[[3]], na.rm = TRUE))
方式3:直接对原始df的第3列汇总
如果不需要提前筛选列,直接对原始df的第3列(示例里的temperature)分组计算均值:
df_grouped <- df %>% group_by(group) %>% summarise(avg_temperature = mean(across(3), na.rm = TRUE))
关键细节说明
across(3)是dplyr中按位置选择列的常用语法,要是需要对多列操作,还可以写成across(2:4)这样的范围形式;- 加上
na.rm = TRUE是为了忽略缺失值,避免结果出现NA,这是处理数值型数据汇总的实用小技巧; - 这种按位置操作的方式完全不依赖列名,完美适配你“不知道列名但知道位置”的需求。
内容的提问来源于stack exchange,提问作者M. Schmid
相关产品推荐
相关产品推荐

