R语言如何使用purrr包map函数高效计算分组列子集最小值
R语言分组计算指定子集最小值的简化实现
你不需要创建中间聚合表再做左连接,直接利用dplyr分组后的窗口计算能力,单步就能得到想要的结果,代码更简洁,运行效率也更高。
推荐实现代码
library(dplyr) # 单步完成计算,无中间表 df_result <- df %>% group_by(index) %>% mutate( # 直接在分组内取符合hour条件的runtime_sec子集计算最小值,自动填充到组内所有行 min_ref = min(runtime_sec[hour >= 8 & hour < 10]) ) %>% ungroup()
代码说明
- 按
index分组后,mutate()会在每个分组内独立计算,计算结果会自动匹配组内每一行,省去了聚合、连接的冗余步骤 - 如果你需要匹配你给出的示例中index=2的输出结果(min_ref=100),只需要把hour判断条件调整为
hour >=8 & hour <=10即可——你当前写的hour <10会把index=2唯一的hour=10行排除在计算范围外,最终得到NA值,和你的预期输出不符 - 如果需要用匿名函数实现,也可以写成如下形式,逻辑和上面的写法完全一致:
# 匿名函数版本 df_result <- df %>% group_by(index) %>% mutate( min_ref = (\(x) min(x[hour >= 8 & hour <= 10]))(runtime_sec) ) %>% ungroup()
关于purrr包map函数的说明
你这个场景属于标准的分组窗口计算,dplyr原生的分组mutate已经是最高效简洁的实现,不需要引入purrr的map系列函数,强行用map反而会增加代码复杂度、降低运行效率。
内容的提问来源于stack exchange,提问作者transit_desert
相关产品推荐
相关产品推荐

