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

循环遍历多份数据框列表,为各数据框添加月份变量的问题

问题:为列表中的数据框添加月份标识变量

我有4个列表,每个列表包含12个数据框,每个列表对应一个年份(比如df_2020对应2020年、df_2021对应2021年,以此类推)。列表里的每个数据框对应一个月份,元素位置就是月份序号——比如df_2020[[1]]是2020年1月的数据,df_2021[[1]]是2021年1月的数据。

我想给每个数据框新增month变量来标识对应的月份,试了下面的代码但报错:

for(j in 20:21) {
for(i in 1:12) {
assign(get(paste0("df_20", j))[[i]], 
       get(paste0("df_20", j))[[i]] %>% 
       mutate(month=i)) ## se le suma 1 al mes porque comienza desde febrero
}
}

错误提示是Error in assign(get(paste0("mies_20", j))[[1]], get(paste0("mies_20", : invalid first argument,问题出在赋值语句的左侧:用get()的话会报错,不用get()的话paste0("df_20", j))[[i]]又无法被识别。


解决思路与代码

核心问题

assign()的第一个参数必须是变量名的字符串,而你传入的get(paste0("df_20", j))[[i]]是直接取出的数据框对象,不是变量名,所以触发错误。直接修改列表元素不需要用assign(),可以先取出整个列表修改,再重新赋值回去。

方法一:基础循环修改原列表

# 遍历目标年份(这里覆盖2020-2023四个年份)
for(j in 20:23) {
  # 获取当前年份对应的列表
  current_list <- get(paste0("df_20", j))
  # 遍历每个月份的数据框,添加month变量
  for(i in 1:12) {
    current_list[[i]] <- current_list[[i]] %>% 
      dplyr::mutate(month = i)
  }
  # 将修改后的列表重新赋值回原变量
  assign(paste0("df_20", j), current_list)
}

方法二:tidyverse风格批量处理

用purrr::map2()可以更简洁地批量处理,避免嵌套循环:

library(purrr)
library(dplyr)

# 逐个处理各年份列表
df_2020 <- map2(df_2020, 1:12, ~ mutate(.x, month = .y))
df_2021 <- map2(df_2021, 1:12, ~ mutate(.x, month = .y))
df_2022 <- map2(df_2022, 1:12, ~ mutate(.x, month = .y))
df_2023 <- map2(df_2023, 1:12, ~ mutate(.x, month = .y))

方法三:批量处理所有年份列表

如果不想重复写代码,可以把所有年份列表的名称存入向量,一次性处理:

library(purrr)
library(dplyr)

# 定义所有年份列表的名称
list_names <- c("df_2020", "df_2021", "df_2022", "df_2023")

for(name in list_names) {
  current_list <- get(name)
  # 为每个数据框添加对应月份的变量
  current_list <- map2(current_list, 1:12, ~ mutate(.x, month = .y))
  # 将修改后的列表存回原变量
  assign(name, current_list)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:45:46