R语言for循环中使用$符号动态选取dataframe变量求均值问题
问题原因
R中$运算符对后续标识符做字面量解析,不会执行变量替换、表达式计算或者rlang语法注入,你写df$!!as.name(xxx)的时候,R会尝试查找df中名为"!!as.name(paste0("Amount_Day_", i))"的列,自然匹配不到,运行报错。另外你代码中用到的!!是rlang包提供的注入操作符,仅能在dplyr、ggplot2等支持数据屏蔽的tidyverse函数参数中使用,直接在base R的赋值语句、$运算符后使用不会生效。
可行实现方案
方案1:base R 方括号索引(最推荐,语法最简单)
用[[索引替代$,[[原生支持传入字符串类型的列名,完全适配动态生成的列名场景:
# 方式1:将计算得到的均值存入命名向量(推荐,避免生成过多零散全局变量) mean_vec <- numeric(16) names(mean_vec) <- paste0("Mean_Amount_Day_", 1:16) for (i in 1:16){ col_name <- paste0("Amount_Day_", i) # 加na.rm = TRUE是为了避免列中存在缺失值时返回NA,不需要可以删除 mean_vec[paste0("Mean_Amount_Day_", i)] <- mean(df[[col_name]], na.rm = TRUE) } # 方式2:如果确实需要生成独立的全局变量,可以用assign实现 for (i in 1:16){ col_name <- paste0("Amount_Day_", i) assign(paste0("Mean_Amount_Day_", i), mean(df[[col_name]], na.rm = TRUE)) }
方案2:tidyverse风格实现
如果你的项目已经在使用tidyverse技术栈,不需要手写for循环也可以批量完成计算:
library(dplyr) # 直接生成汇总数据框,列名自动对应格式要求 mean_df <- df %>% summarise(across(starts_with("Amount_Day_"), ~mean(.x, na.rm = TRUE), .names = "Mean_{.col}")) # 按需提取对应日期的均值即可,比如提取第3天的均值 # mean_day_3 <- pull(mean_df, Mean_Amount_Day_3)
内容的提问来源于stack exchange,提问作者Lola1993
相关产品推荐
相关产品推荐

