创建一个tibble,其中一列是一个函数

时间:2018-01-19 09:46:59

标签: r list tidyverse purrr tibble

假设我有一个看起来像这样的元素:

library(tidyverse)
tib <- tibble (a = 1:3, b = 4:6, d = -1:1)

我想在此tibble中添加一列,其中每个条目都是带参数a,b和d的函数(如f(x)= a x ^ 2 + b x + d)。 这意味着(例如)在第一行中我想添加函数f(x)= 1 x ^ 2 + 4 x -1,依此类推。

我尝试了以下内容:

tib2 <- tib %>%
   mutate(fun = list(function(x) {a*x^2+b*x+d}))

这不起作用,因为函数不知道a,b和d是什么。

我设法使用函数 mapply

构建了一个解决方案
lf <- mapply(function(a,b,d){return(function(x){a*x^2 + b*x + d})}, tib$a, tib$b, tib$d)
tib3 <- tib %>% 
  add_column(lf)

我想知道是否有人知道在整齐的过程中更优雅的方式。感觉有一种方法可以使用 purrr 包中的 map 函数,但我没有设法让它工作。

谢谢

1 个答案:

答案 0 :(得分:1)

在您的示例中使用mutate时,您给它一个包含一个元素(函数)的列表。因此,这一个功能被回收用于所有其他行。此外,在函数定义中,它没有abd的任何可见性。

您可以改为使用pmap,以便每一行都有自己的功能。

tib2 <- tib %>%
  mutate(
    fun = pmap(
      list(a, b, d),
      ~function(x) ..1 * x^2 + ..2 * x + ..3))

tib2
#> # A tibble: 3 x 4
#>       a     b     d    fun
#>   <int> <int> <int> <list>
#> 1     1     4    -1  <fun>
#> 2     2     5     0  <fun>
#> 3     3     6     1  <fun>

tib2$fun[[1]](1)
#> [1] 4