循环遍历多份数据框列表,为各数据框添加月份变量的问题
问题:为列表中的数据框添加月份标识变量
我有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
相关产品推荐
相关产品推荐

