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

使用dplyr动态计算数据框连续列均值的技术问题

解决动态列名计算均值的问题

你的代码主要有两个问题:一是用{{}}处理字符串类型的列名不对({{}}是用来解析符号参数的,不是字符串);二是函数最后没返回修改后的数据集,等于白做了。下面给你修正后的方案:

修正版循环函数(两种写法)

写法1:用.data代词(推荐,更直观)

library(dplyr)

mean_col <- function(data, k) {
  n <- 2*k + 1  
  m <- 2*k + 2
  varname_even <- paste("PUISSANCE", m, sep = "")
  varname_odd <- paste("PUISSANCE", n, sep = "")
  
  # 用.data[[列名字符串]]引用列,左边用!!把字符串转成列名
  data <- mutate(data, !!varname_odd := (.data[[varname_odd]] + .data[[varname_even]])/2)
  data
}

for (k in 0:24) {
  my_data_set <- mean_col(my_data_set, k)
}

写法2:用sym+!!(传统tidyeval方式)

library(dplyr)
library(rlang)

mean_col <- function(data, k) {
  n <- 2*k + 1  
  m <- 2*k + 2
  # 把字符串转成符号
  varname_even <- sym(paste("PUISSANCE", m, sep = ""))
  varname_odd <- sym(paste("PUISSANCE", n, sep = ""))
  
  # 用!!求值符号,实现列引用
  data <- mutate(data, !!varname_odd := (!!varname_odd + !!varname_even)/2)
  data
}

for (k in 0:24) {
  my_data_set <- mean_col(my_data_set, k)
}

更高效的无循环写法

如果不想用循环,可以直接批量分组处理列,代码更简洁:

library(dplyr)
library(purrr)
library(rlang)

# 提取所有PUISSANCE开头的列并按数字排序
puissance_cols <- sort(grep("^PUISSANCE\\d+$", colnames(my_data_set), value = TRUE))
# 每两列分为一组
col_groups <- split(puissance_cols, ceiling(seq_along(puissance_cols)/2))

# 批量处理每组,用reduce迭代更新数据框
my_data_set <- reduce(col_groups, function(df, cols) {
  mutate(df, !!cols[1] := (!!sym(cols[1]) + !!sym(cols[2]))/2)
}, .init = my_data_set)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:19:00