R语言分组计算时如何仅调用一次返回多结果的自定义函数
解决方案
你可以通过临时存储函数返回的列表结果,再展开为多列的方式,仅调用一次自定义函数完成计算,以下是两种常用的实现方案:
方案1:借助临时列表列+unnest_wider展开(无需修改原函数)
你不需要调整已经写好的myFunction,仅需在管道中先将每组的函数返回结果存入临时列表列,再用tidyr::unnest_wider直接展开为新列即可:
library(dplyr) library(tidyr) myFunction <- function(x, y){ list(a = x + y, b = cumsum(x)) } data <- data.frame(var1 = c(1,2,4,7,2), var2 = c(2,6,2,4,6), groups = c("a", "a", "b", "b", "b")) # 仅调用一次函数的实现 data %>% group_by(groups) %>% mutate(res = list(myFunction(var1, var2))) %>% # 每组仅调用一次函数,结果存入列表列 unnest_wider(res) %>% # 把列表的两个元素展开为a、b两列 rename(new1 = a, new2 = b) # 按需修改新列名
该方法下每个分组仅调用一次myFunction,完全避免重复计算。
方案2:修改函数返回tibble,直接生成多列
如果可以调整自定义函数的返回格式,直接返回tibble结构的结果,dplyr的mutate会自动把返回的多列追加到原数据框中,写法更简洁:
library(dplyr) # 修改函数返回为tibble myFunction <- function(x, y){ tibble(new1 = x + y, new2 = cumsum(x)) } data %>% group_by(groups) %>% mutate(myFunction(var1, var2)) # 直接调用函数,自动追加新列
两种方案最终得到的结果和你原有两次调用函数的写法完全一致,计算效率更高,尤其适合自定义函数计算逻辑复杂、耗时较长的场景。
内容的提问来源于stack exchange,提问作者Francois51
相关产品推荐
相关产品推荐

