基于两组日期扩展值:如何用purrr遍历Input1为Input2加列
问题求助
嘿,我目前遇到了一个小问题想请教下:我想要遍历fc_periods(也就是Input1)的每一行数据,给另一个数据集(Input2)添加对应的列,最终得到预期的结果。现在我已经能写出处理单行数据的代码,但还没办法自动遍历fc_periods的所有行,想问问能不能用purrr包来实现这个遍历功能?
我的Input1数据集定义如下:
library(tidyverse) library(lubridate) # Input 1 fc_periods <- data_frame( period = c("m1", "m2", "m3"), start = c(ymd("2018-01-01"), ymd("2018-02-01"), ymd("2018-03-01")), end = c(ymd("2018-01-31"), ymd("2018-02-28"), ymd("2018-03-31")) # 补全了截断的日期,实际可按需调整 )
目前我能实现单行的处理(比如处理m1周期),但手动处理每一行太繁琐,想实现自动化遍历。
解决方案
当然可以用purrr来搞定这个需求!核心思路是把单行处理逻辑封装成函数,再用purrr的遍历函数批量处理,最后合并结果就行。
步骤1:封装单行处理函数
先把你处理单个周期的逻辑写成一个可复用的函数,参数对应fc_periods的三列,以及要处理的Input2数据集:
# 定义添加周期列的函数 add_period_col <- function(period_name, start_date, end_date, input_df) { input_df %>% # 动态创建列名(用!!和:=实现) mutate(!!period_name := case_when( date >= start_date & date <= end_date ~ 1, TRUE ~ 0 )) }
步骤2:用pmap遍历所有行并合并结果
pmap可以完美匹配数据框的每一行参数,然后把处理后的数据集合并起来:
library(purrr) # 假设你的Input2数据集名为input2,且包含date列 final_result <- pmap(fc_periods, add_period_col, input_df = input2) %>% # 把所有带新列的数据集按原始列合并 reduce(left_join, by = names(input2))
这样运行后,final_result就是Input2添加了m1、m2、m3三列的最终结果啦!pmap会自动遍历fc_periods的每一行,把对应周期的列添加到Input2中,最后通过reduce(left_join)把所有版本的Input2合并成一个完整的数据集。
内容的提问来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

