R语言中如何处理以变量为名称的循环?求和问题求助
解决方案:按国家代码批量求和消费数据列
你的代码核心问题是没有动态解析变量i对应的列名,直接写**i**_final consumption P.3h会被当成固定字符串,而非变量i的取值;同时循环中每次都会覆盖结果,没有累积生成所有国家的求和列。以下是两种可行的解决方案:
方法一:修正循环写法
# 初始化结果数据框,保留原df的所有内容 df_all_countries <- df # 遍历每个国家代码 for (i in country) { # 动态生成对应列的名称 col_final <- paste0(i, "_final consumption P.3h") col_other <- paste0(i, "_other consumption P.3n") # 计算两列的和,作为新列添加到结果数据框 df_all_countries[[paste0("fd_", i)]] <- FD[[col_final]] + FD[[col_other]] }
方法二:用tidyverse批量处理(更简洁)
利用dplyr的across函数批量处理所有国家的列,无需循环:
library(dplyr) library(stringr) df_all_countries <- df %>% bind_cols( FD %>% mutate( across( # 匹配所有以国家代码开头、结尾为P.3h的列 starts_with(country) & ends_with("P.3h"), # 找到对应国家的P.3n列并求和 ~ . + get(str_replace(cur_column(), "P.3h", "P.3n")), # 定义新列名格式为fd_国家代码 .names = "fd_{str_remove(cur_column(), '_final consumption P.3h')}" ) ) %>% # 只保留生成的求和列 select(starts_with("fd_")) )
或者用purrr的map函数批量生成列:
library(dplyr) library(purrr) library(rlang) # 批量生成每个国家的求和列 fd_cols <- map(country, function(i) { FD %>% transmute(!!paste0("fd_", i) := !!sym(paste0(i, "_final consumption P.3h")) + !!sym(paste0(i, "_other consumption P.3n"))) }) # 合并到原df中 df_all_countries <- df %>% bind_cols(!!!fd_cols)
内容的提问来源于stack exchange,提问作者jmph
相关产品推荐
相关产品推荐

