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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:21:59