创建一个小标题,其中一列是一个函数
create a tibble where one column is a function
假设我有一个看起来像这样的小标题:
library(tidyverse)
tib <- tibble (a = 1:3, b = 4:6, d = -1:1)
我想在此小标题中添加一列,其中每个条目都是一个带有参数 a、b 和 d 的函数(例如 f(x) = ax^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
函数构建了一个 work-around 解决方案
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)
我想知道是否有人知道在 tidyverse 中执行此操作的更优雅的方法。感觉好像有一种方法可以使用 purrr 包中的 map 函数,但我没能成功。
谢谢
当您在您的示例中使用 mutate
时,您为其提供了一个包含一个元素(函数)的列表。所以这个函数被回收用于所有其他行。此外,在函数的定义中,它没有 a
、b
或 d
.
的任何可见性
您可以改为使用 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
假设我有一个看起来像这样的小标题:
library(tidyverse)
tib <- tibble (a = 1:3, b = 4:6, d = -1:1)
我想在此小标题中添加一列,其中每个条目都是一个带有参数 a、b 和 d 的函数(例如 f(x) = ax^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
函数构建了一个 work-around 解决方案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)
我想知道是否有人知道在 tidyverse 中执行此操作的更优雅的方法。感觉好像有一种方法可以使用 purrr 包中的 map 函数,但我没能成功。
谢谢
当您在您的示例中使用 mutate
时,您为其提供了一个包含一个元素(函数)的列表。所以这个函数被回收用于所有其他行。此外,在函数的定义中,它没有 a
、b
或 d
.
您可以改为使用 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