如何在R中使用purrr包的map变体基于lambda向量生成新列?
用purrr批量生成新列的解决方案
核心实现代码
直接使用purrr::reduce()累积处理数据框,逐步添加对应lambda值的新列:
library(tidyverse) multiply_column <- function(data, column_name, lambda) { new_column_name <- paste0(column_name, "_multiplied_", lambda) data %>% mutate(!!new_column_name := !!sym(column_name) * lambda) } lambda_values <- c(0.5, 0.75, 0.9) # 批量生成新列 mtcars_processed <- lambda_values %>% reduce(.init = mtcars, ~ multiply_column(.x, "mpg", .y)) # 查看前10行结果 head(mtcars_processed, 10)
代码说明
reduce()从.init指定的初始数据框(mtcars)开始,依次遍历lambda_values中的每个值:.x代表每次迭代后累积得到的结果数据框.y代表当前正在处理的lambda值- 每次调用
multiply_column,都会在现有数据框上新增一列,最终得到包含所有目标列的完整数据框
另一种实现方式(map + 合并)
如果偏好先用map生成所有新列再合并,也可以这么写:
# 先生成所有新列(仅保留新增列) new_columns <- lambda_values %>% map_dfc(~ multiply_column(mtcars, "mpg", .y) %>% select(starts_with("mpg_multiplied"))) # 和原数据框合并 mtcars_processed <- bind_cols(mtcars, new_columns)
两种方式都能得到你期望的输出格式,其中reduce的方式更高效,因为不需要重复处理原数据框多次。
内容的提问来源于stack exchange,提问作者The Rookie
相关产品推荐
相关产品推荐

