如何使用purrr替代嵌套循环高效创建多变量未来数据框
高效创建未来数据框的实现方案(含purrr版本)
原代码性能问题根源
- 重复执行日期生成逻辑,每个循环都计算一次相同的52周序列,完全冗余
- 循环内反复调用
rbind,每次都会全量复制已生成的数据框,数据量越大性能损耗越夸张 - 维度长度计算时重复调用
unique,你提前提取的prods/class等本身已经是去重结果,重复计算无意义 - 额外提示:
class是R的内置函数名,用作变量名可能触发偶发错误,建议重命名为prod_class等自定义名称
最高效通用实现(tidyverse原生)
library(tidyverse) # 提前提取所有维度的唯一值 dims <- lst( ProdLine = unique(sales$ProdLine), Class = unique(sales$Class), OrderType = unique(sales$Ordertype), rep = unique(sales$Rep), Type = unique(sales$Type) ) # 生成所有维度全组合后批量关联未来日期,全程无循环无逐次绑定 Future_Frame <- crossing(!!!dims) %>% mutate(Date = list(seq(max(sales$Date), by = "week", length.out = 52))) %>% unnest(Date)
purrr专属实现
library(purrr) library(dplyr) library(tidyr) # 提前一次性生成未来52周日期 future_dates <- seq(max(sales$Date), by = "week", length.out = 52) # 生成维度全组合后用purrr批量关联日期 Future_Frame <- cross_df(dims) %>% split(seq(nrow(.))) %>% map_dfr(~ mutate(.x, Date = future_dates))
以上两种方案的运行效率相比原嵌套循环提升至少两个数量级,数据量越大优势越明显。
内容的提问来源于stack exchange,提问作者KBE11416
相关产品推荐
相关产品推荐

