如何对分组tibble应用返回data.frame的函数且不使用for循环
问题原因
pmap_dfr为行级迭代函数,会逐行提取列值传入自定义函数,无法识别dplyr的分组设置按组批量传入数据,不符合按组处理的需求- 你代码中使用的
.keep参数不属于pmap_dfr的合法参数,也无法实现保留分组列的效果
正确实现方案
推荐使用dplyr提供的group_modify()函数,专门用于分组数据按组应用返回数据框的自定义函数,实现代码如下:
library(dplyr) # 固定随机种子方便结果复现 set.seed(123) df <- data.frame(start=1:10,end=21:30,g=sample(LETTERS[1:2],10,replace=TRUE)) ff <- function(start,end,... ) { out <- data.frame(T1=c(start,rev(start)),T2=c(end,rev(end))) return(out) } # 分组计算+保留分组列+调整列名匹配预期输出 result <- df %>% group_by(g) %>% group_modify(~ ff(start = .x$start, end = .x$end)) %>% rename(start = T1, end = T2) %>% ungroup()
如果偏好使用purrr系列函数实现,可以先对分组数据做嵌套再迭代:
library(dplyr) library(purrr) library(tidyr) result <- df %>% nest(.by = g) %>% mutate(res = map(data, ~ ff(.x$start, .x$end))) %>% unnest(res) %>% select(g, start = T1, end = T2)
说明
两种方案都支持自定义函数调用原数据的任意列:
- 使用
group_modify时,.x代表当前分组的所有数据,直接通过.x$列名调用即可 - 使用嵌套方案时,自定义函数可以从嵌套后的分组数据框中提取任意需要的字段
内容的提问来源于stack exchange,提问作者Fredrik Nylén
相关产品推荐
相关产品推荐

