如何在dplyr生态中更简洁实现分组数据按行提取指定区间向量的最小值(偏好匿名函数实现)
更简洁的dplyr+purrr实现方案
当然有更简洁的实现方式!你的核心需求是分组后,对每一行根据start和end提取temp列的区间最小值,可以直接在dplyr的管道里结合map2_dbl和匿名函数完成,不需要单独定义外部函数,也能避免group_map返回列表的繁琐。
优化后的代码
library(dplyr) library(purrr) # 设置随机种子保证结果可复现 set.seed(123) dat <- data.frame( temp = rnorm(10, 10, 2), start = c(1:5, 1:5), end = c(2, 2, 4, 5, 5, 2, 3, 4, 5, 5), group = c(rep("a", 5), rep("b", 5)) ) # 核心实现:分组后直接新增结果列 dat %>% group_by(group) %>% mutate(min_temp = map2_dbl(start, end, ~min(temp[.x:.y]))) %>% ungroup()
为什么这个方案更简洁?
- 无需外部函数:用purrr的波浪号
~语法定义匿名函数,直接在mutate里完成计算,省去了单独写fun.try的步骤。 - 结果直接整合:通过
mutate将计算出的最小值作为新列添加到原数据框中,比group_map返回独立列表更符合日常数据分析的工作流。 - 更精准的映射:因为只需要对应
start和end两个变量,用map2_dbl比pmap_dbl更贴合场景,代码可读性更强。
如果仍需要分组列表输出
如果你确实需要保留group_map的列表输出形式,也可以简化成:
dat %>% group_by(group) %>% group_map(~mutate(.x, min_temp = map2_dbl(start, end, ~min(.x$temp[.x:.y]))))
这个版本同样用匿名函数完成计算,比你原来的实现少了外部函数的定义,代码更紧凑。
内容的提问来源于stack exchange,提问作者user2602640
相关产品推荐
相关产品推荐

