如何用dplyr::mutate结合purrr::pmap处理数据框每行的多输出函数
解决方法:用dplyr逐行调用多输出函数并拆分结果
这需求太常见了,结合dplyr和tidyr就能轻松搞定,我给你直接上可运行的方案,再拆解每一步逻辑:
首先先把你的函数和初始数据框准备好:
# 定义生成多输出的函数 example_fun <- function(a,b){ x = a+b y = a-b return(list(x=x, y=y)) } # 初始数据框 df <- expand.grid(a=c(7,8), b=c(9,10))
推荐方案:pmap + unnest_wider
你之前的思路已经走对了一半,用pmap逐行传递参数给函数,接下来只需要用unnest_wider把生成的list列拆成单独的x和y列就行:
library(dplyr) library(tidyr) # 依赖这个包的unnest_wider函数 # 处理数据 df_result <- df %>% # 逐行调用example_fun,生成包含x和y的list列outputs mutate(outputs = pmap(list(a, b), example_fun)) %>% # 把list列拆成对应列名的单独列 unnest_wider(outputs) # 查看最终结果 df_result
运行后得到的结果完全符合你的要求:
# A tibble: 4 × 4 a b x y <dbl> <dbl> <dbl> <dbl> 1 7 9 16 -2 2 8 9 17 -1 3 7 10 17 -3 4 8 10 18 -2
逻辑拆解
pmap(list(a, b), example_fun):pmap会遍历数据框的每一行,把该行的a和b作为参数传入example_fun,每行都会返回一个包含x和y的list,这些list会被统一存到新列outputs里。unnest_wider(outputs):这个函数会自动识别list里的元素名称(也就是x和y),把它们拆成独立的列,完美匹配你想要的输出结构。
备选方案:rowwise分组调用
如果你觉得pmap有点抽象,也可以用rowwise()分组后直接调用函数提取结果,不过这种方法会重复调用两次函数,适合函数计算量小的场景:
df_result <- df %>% rowwise() %>% mutate( x = example_fun(a, b)$x, y = example_fun(a, b)$y ) %>% ungroup() # 处理完记得取消分组
内容的提问来源于stack exchange,提问作者Lee88
相关产品推荐
相关产品推荐

