You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:44:15