如何用purrr包对多个数据框执行相似mutate()操作且不创建列表?
用purrr批量处理数据框的简化方案
当然可以用purrr包大幅简化这类重复操作,核心是把重复逻辑抽象后批量执行,具体实现如下:
步骤1:整理数据与参数
先把要处理的三个数据框和对应的配置(国家名称、日期解析函数)配对:
library(purrr) library(dplyr) library(lubridate) # 提供ym、my函数 # 把数据框存入命名列表 df_list <- list(xk = xk, al = al, mne = mne) # 定义每个数据框对应的参数:国家名、日期处理函数 param_list <- list( list(country = "Kosovo", date_fun = ym), list(country = "Albania", date_fun = ym), list(country = "Montenegro", date_fun = my) )
步骤2:批量执行处理逻辑
用purrr::map2遍历数据框和对应参数,统一执行mutate和relocate操作:
# 批量处理得到结果列表 processed_dfs <- map2(df_list, param_list, function(df, params) { df %>% mutate(country = params$country, date = params$date_fun(date)) %>% relocate(country) })
步骤3:(可选)将结果放回原变量
如果需要把处理后的数据框重新赋值回xk、al、mne这三个变量,用list2env实现:
list2env(processed_dfs, .GlobalEnv)
更简洁的写法
也可以把参数和数据框直接内嵌,一步完成:
processed_dfs <- map2( .x = list(xk, al, mne), .y = list( list("Kosovo", ym), list("Albania", ym), list("Montenegro", my) ), ~ .x %>% mutate(country = .y[[1]], date = .y[[2]](date)) %>% relocate(country) ) # 放回原变量 list2env(set_names(processed_dfs, c("xk", "al", "mne")), .GlobalEnv)
这样就用极少的代码完成了三个数据框的重复操作,彻底消除了代码冗余。
内容的提问来源于stack exchange,提问作者gentiang
相关产品推荐
相关产品推荐

