使用存储在 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.X
和train.Y
,并将函数的输出存储到一个新的列。
从概念上讲,类似于:
df %>% mutate(result = pmap(train.X,train.Y,model)
我一直在尝试使用 pmap()
,但没有成功。
这里需要一些指导。
invoke_map
应该在您将 train.X
和 train.Y
组合成一个列表后工作。这是可以测试的类似情况下的基本示例。 tib
模仿您的情况,因为 x
和 y
是您需要提供该功能的参数。在示例中,我使用 runif
函数,该函数接受参数加上 n
。我使用 map2
将 x
和 y
包装在名为 "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))
我有以下问题:
# 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.X
和train.Y
,并将函数的输出存储到一个新的列。
从概念上讲,类似于:
df %>% mutate(result = pmap(train.X,train.Y,model)
我一直在尝试使用 pmap()
,但没有成功。
这里需要一些指导。
invoke_map
应该在您将 train.X
和 train.Y
组合成一个列表后工作。这是可以测试的类似情况下的基本示例。 tib
模仿您的情况,因为 x
和 y
是您需要提供该功能的参数。在示例中,我使用 runif
函数,该函数接受参数加上 n
。我使用 map2
将 x
和 y
包装在名为 "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))