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

时间:2017-03-05 04:22:51

标签: r 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(),但没有成功。

需要一些指导。

1 个答案:

答案 0 :(得分:1)

invoke_maptrain.X合并到列表后,

train.Y应该可以正常工作。这是一个可以测试的类似情况的基本示例。 tib模仿您的情况,xy是您提供此功能所需的参数。在示例中,我使用runif函数,该函数采用参数加n。我使用map2xy包含在名为&#34; params&#34;的列表列中。然后我使用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))