使用存储在 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
中.
As you can see, modelName
is the name of the model, stored as a function in model
.
我想要做的是对于每一行,调用存储在model
中的函数,传递给train.X
和train.Y
作为参数,并将函数的输出存储到一个新列中.
What I want to do is for each row, call the function stored in model
, pass it train.X
and train.Y
as parameters, and store the function's output into a new column.
概念上,类似于:
df %>% mutate(result = pmap(train.X,train.Y,model)
我一直在尝试使用 pmap()
,但没有成功.
I've been trying to use pmap()
, but to no success.
需要一些指导.
推荐答案
invoke_map
在你结合 train.X
和 train.Y
后应该可以工作> 进入列表.这是可以测试的类似情况下的基本示例.tib
模仿您的情况,因为 x
和 y
是您提供函数所需的参数.在这个例子中,我使用了 runif
函数,它接受参数加上 n
.我使用 map2
将 x
和 y
包装在名为params"的列表列中.然后我使用 invoke_map()
函数来迭代地将函数应用于参数.
invoke_map
should work after you combine train.X
and train.Y
into a list. Here's a basic example in a similar situation that could be tested. tib
mimics your situation in that x
and y
are parameters you need to provide the function. In the example, I use the runif
function which takes the parameters plus n
. I use map2
to get x
and y
wrapped in a list column called "params". Then I use the invoke_map()
function to iteratively apply functions to the params.
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]>
现在我们只需要将相同的过程应用到您的示例中.这应该有效.
Now we just need to apply the same procedure to your example. This should work.
df %>%
mutate(params = map2(train.X, train.Y, list)) %>%
mutate(result = invoke_map(model, params))
这篇关于使用存储在 list-cols 中的函数和参数 - Purrr的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!