R语言嵌套数据框jDate差值计算与列表矩阵批量除法优化方案
优化实现方案
核心优化思路
- 预计算6月、7月对应ID各10天区间的
jDate最小值,避免重复嵌套索引取值,减少冗余计算 - 用
outer函数向量化生成差值矩阵m1,替代手动逐行拼接,代码更简洁,且适配任意数量的区间 - 用
purrr::modify_depth批量处理列表内的所有矩阵,无需手动按索引访问,可适配任意长度的矩阵列表
完整实现代码
你只需要把原代码中## Hoping to get a function for everything below here ##后的内容替换为以下代码即可:
# 自定义工具函数:提取指定ID对应的各10天区间jDate最小值 get_interval_min <- function(nested_df, target_id) { nested_df %>% filter(ID == target_id) %>% pull(data) %>% pluck(1) %>% map_dbl(~ min(.x$jDate)) } # 以ID为"A"为例计算差值矩阵m1,可按需替换为其他ID june_min <- get_interval_min(nested_june, "A") july_min <- get_interval_min(nested_july, "A") # 向量化计算差值矩阵:m1[i,j] = 7月第j个区间最小jDate - 6月第i个区间最小jDate m1 <- outer(june_min, july_min, function(jun_min, jul_min) jul_min - jun_min) # 批量对l1内所有矩阵做除法,返回的结果结构和l1完全一致 processed_l1 <- modify_depth(l1, .depth = 2, .f = ~ .x / m1) # 输出验证结果,和原需求预期一致 processed_l1[[1]][[1]] processed_l1[[2]][[1]]
扩展说明
如果需要对所有ID批量计算对应的m1和矩阵处理,仅需在外层加一层对ID向量的遍历即可,整体逻辑无需调整。
内容的提问来源于stack exchange,提问作者John Huang
相关产品推荐
相关产品推荐

