R中如何用map()迭代向量为列表内数据框批量生成计算列
解决方案
你可以通过!!!操作符将遍历vector生成的列参数动态注入mutate中,适配任意长度的向量,写法如下:
library(tidyverse) # 示例数据 tbl1 <- tibble(Code = c(1,2,3,4), Column1 = c(10,11,12,13), Column2 = c(14,15,16,17)) tbl2 <- tibble(Code = c(5,6,7,8), Column1 = c(14,15,16,17), Column2 = c(18,19,20,21)) my_list <- list(Element1 = tbl1, Element2 = tbl2) vector <- c(0.5, 0.6, 0.7, 0.8) # 通用计算代码 result <- my_list %>% map(function(df) { df %>% mutate( # 遍历vector生成所有新列,用!!!展开为mutate的多参数 !!!map( .x = set_names(vector, ~ paste0("Column_", .x)), .f = ~ Column2 * .x ) ) })
代码逻辑说明
- 外层
map遍历列表中的每个数据框,和原有逻辑一致 - 内层
map遍历vector的每一个元素:- 先用
set_names给向量的每个值绑定对应的新列名,格式为Column_系数值 - 每个元素对应计算逻辑为
Column2乘该系数,直接向量化运算比pmap_dbl更高效
- 先用
!!!是tidyeval的展开操作符,会把内层map生成的命名列表自动拆成mutate的多个列定义参数,不需要手动逐个写列的生成逻辑,vector长度变化时不需要修改代码,自动适配。
运行上述代码得到的result和你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者eka
相关产品推荐
相关产品推荐

