使用存储在 list-cols 中的函数和参数 - Purrr

Use functions and parameters stored in list-cols - Purrr

我有以下问题:

# A tibble: 18 × 6
      id                     columnFilter  modelName  model               train.X        train.Y
   <int>                            <chr>      <chr> <list>                <list>         <list>
1      1              groupedColumns.donr boostModel  <fun> <tibble [3,984 × 17]> <fctr [3,984]>
2      2       groupedSquaredColumns.donr boostModel  <fun> <tibble [3,984 × 28]> <fctr [3,984]>
3      3   groupedTransformedColumns.donr boostModel  <fun> <tibble [3,984 × 17]> <fctr [3,984]>
4      4            ungroupedColumns.donr boostModel  <fun> <tibble [3,984 × 17]> <fctr [3,984]>
5      5     ungroupedSquaredColumns.donr boostModel  <fun> <tibble [3,984 × 28]> <fctr [3,984]>
6      6 ungroupedTransformedColumns.donr boostModel  <fun> <tibble [3,984 × 17]> <fctr [3,984]>
7      7              groupedColumns.donr   ldaModel  <fun> <tibble [3,984 × 17]> <fctr [3,984]>
8      8       groupedSquaredColumns.donr   ldaModel  <fun> <tibble [3,984 × 28]> <fctr [3,984]>
9      9   groupedTransformedColumns.donr   ldaModel  <fun> <tibble [3,984 × 17]> <fctr [3,984]>
10    10            ungroupedColumns.donr   ldaModel  <fun> <tibble [3,984 × 17]> <fctr [3,984]>
11    11     ungroupedSquaredColumns.donr   ldaModel  <fun> <tibble [3,984 × 28]> <fctr [3,984]>
12    12 ungroupedTransformedColumns.donr   ldaModel  <fun> <tibble [3,984 × 17]> <fctr [3,984]>
13    13              groupedColumns.donr logitModel  <fun> <tibble [3,984 × 17]> <fctr [3,984]>
14    14       groupedSquaredColumns.donr logitModel  <fun> <tibble [3,984 × 28]> <fctr [3,984]>
15    15   groupedTransformedColumns.donr logitModel  <fun> <tibble [3,984 × 17]> <fctr [3,984]>
16    16            ungroupedColumns.donr logitModel  <fun> <tibble [3,984 × 17]> <fctr [3,984]>
17    17     ungroupedSquaredColumns.donr logitModel  <fun> <tibble [3,984 × 28]> <fctr [3,984]>
18    18 ungroupedTransformedColumns.donr logitModel  <fun> <tibble [3,984 × 17]> <fctr [3,984]>

如您所见,modelName是模型的名称,作为函数存储在model中。

我想要做的是对每一行,调用存储在model中的函数,将它作为参数传递给train.Xtrain.Y,并将函数的输出存储到一个新的列。

从概念上讲,类似于:

df %>% mutate(result = pmap(train.X,train.Y,model)

我一直在尝试使用 pmap(),但没有成功。

这里需要一些指导。

invoke_map 应该在您将 train.Xtrain.Y 组合成一个列表后工作。这是可以测试的类似情况下的基本示例。 tib 模仿您的情况,因为 xy 是您需要提供该功能的参数。在示例中,我使用 runif 函数,该函数接受参数加上 n。我使用 map2xy 包装在名为 "params" 的列表列中。然后我使用 invoke_map() 函数迭代地将函数应用于参数。


library(tidyverse)

# Basic example
tib <- tribble(
    ~fun, ~x, ~y,
    runif, -1, 1,
    runif, -10, 10,
    runif, -3,3
)
tib
#> # A tibble: 3 × 3
#>      fun     x     y
#>   <list> <dbl> <dbl>
#> 1  <fun>    -1     1
#> 2  <fun>   -10    10
#> 3  <fun>    -3     3

tib %>%
    mutate(params = map2(x, y, list)) %>%
    mutate(result = invoke_map(fun, params, n = 5))
#> # A tibble: 3 × 5
#>      fun     x     y     params    result
#>   <list> <dbl> <dbl>     <list>    <list>
#> 1  <fun>    -1     1 <list [2]> <dbl [5]>
#> 2  <fun>   -10    10 <list [2]> <dbl [5]>
#> 3  <fun>    -3     3 <list [2]> <dbl [5]>

现在我们只需要对您的示例应用相同的过程。这应该有效。

df %>%
    mutate(params = map2(train.X, train.Y, list)) %>%
    mutate(result = invoke_map(model, params))