r - 在 data.frame 上使用 invoke_map() 或 exec()

标签 r purrr

我有一个数据框,其中不同的行需要不同的评估来计算结果。这些评估中的每一个都在一个函数中实现,并且要使用的相应函数在数据框中的一列中指定。这是一个最小的例子:

f1 = function(a,...){return(2*a)}
f2 = function(a,b,...){return(a+b)}

df = data.frame(a=1:4,b=5:8,f=c('f1','f2','f2','f1'))

#Expected result:
  a b  f result
1 1 5 f1      2
2 2 6 f2      8
3 3 7 f2     10
4 4 8 f1      8

使用 pmap,我可以将一个函数应用于数据帧的每一行,我还阅读了关于 exec() 替换 invoke_map(),但我将两者结合起来的尝试似乎都没有奏效,因为 exec() 似乎只适用于列表:

df$result = purrr::pmap(df,df$f)
df$result = purrr::pmap(df$f,exec,df)
...

有没有比过滤每个函数的数据帧更优雅的方法,在每个过滤的数据帧上使用 pmap,然后将所有内容重新绑定(bind)在一起?

提前致谢!

编辑:我应该提到我的数据框有很多列,并且函数不需要相同的参数(例如,有些可能会跳过'''a''',但需要'''b''' ).因此,我需要一种不需要显式传递参数的方法。

最佳答案

你可以用 exec() 和 pmap() 来做到这一点

f1 = function(a,...){return(2*a)}
f2 = function(a,b,...){return(a+b)}

df = data.frame(a= 1:4, b = 5:8, f = c('f1',' f2', 'f2', 'f1'))

require(purrr)
require(dplyr)

df |> mutate(result = pmap(list(f, a, b), exec))
#>   a b  f result
#> 1 1 5 f1      2
#> 2 2 6 f2      8
#> 3 3 7 f2     10
#> 4 4 8 f1      8

reprex package 创建于 2022-05-27 (v2.0.1)


附言。您可能会遇到错误,因为您将命名参数传递给 exec()。当您 pmap(list(f = "f1", a = 1, b = 1), exec) 时,所有命名参数都传递给 ...exec(.fn, ...),因为没有一个列表元素被命名为 .fn

在上面的示例中,列表元素在没有名称的情况下传递,因此第一个参数(通过 exec())假定为 .fn

因此,您可以将建议的方法与 base::unname() 结合使用:

df |> relocate(f) |> unname() |> pmap(exec)
# [[1]]
# [1] 2
#
# [[2]]
# [1] 8
# 
# [[3]]
# [1] 10
#
# [[4]]
# [1] 8

如果没有 unname() 你会得到错误:

df |> relocate(f) |> pmap(exec)
# Error in .f(f = .l[[1L]][[i]], a = .l[[2L]][[i]], b = .l[[3L]][[i]], ...):
#   argument ".fn" is missing, with no default

或者,您可以将 df$f 重命名为 df$.fn 并传递整个 data.frame:

df |> rename(.fn = "f") |> pmap(exec)
# [[1]]
# [1] 2
#
# [[2]]
# [1] 8
# 
# [[3]]
# [1] 10
#
# [[4]]
# [1] 8

关于r - 在 data.frame 上使用 invoke_map() 或 exec(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72405635/

相关文章:

r - 如何处理 MatchIt 中无法识别的替换公式(例如)?

r - 以编程方式在 Markdown 中创建选项卡和绘图

r - 如何在 RStudio Markdown 中编译 pdf?

r - 查找任何指定行的单元格值为 1 的所有列名

r - 来自all.equal.POSIXct的意外输出

r - 在ggplot2热图中为相同值获取不同的颜色

r - 使用公式(而不是函数)指定 map2() 的选项

r - 为嵌套列表中的每条记录绘制回归线

r - 从 purrr 的 pmap() 调用 var() 返回 NA

r - purrr::pmap 用于具有多个输入和多个返回值的函数