gpt4 book ai didi

r - 在具有不同参数的数据框中每行应用/映射不同的函数

转载 作者:行者123 更新时间:2023-12-04 14:38:30 24 4
gpt4 key购买 nike

我有一个简单的问题要问你们那些咕噜咕噜的专家,我已经有一段时间没有尽最大努力在谷歌上搜索了。首先,让我们看一下我正在尝试使用的嵌套列表数据结构。

加载包

#R version 3.4.1    
library(purrr) # version 0.2.4
library(dplyr) # version 0.7.4

定义函数
f1 <- function(a, b, c) {a + b^c}
f2 <- function(x) {x * 2}
f3 <- function(y, z) {y * z}

定义参数集

这些将传递给 f1 中的每一个。 , f2 , 和 f3 :
p1 <- data_frame(a = c(2, 4, 5, 7, 8),
b = c(1, 1, 2, 2, 2),
c = c(.5, 5, 1, 2, 3))
p2 <- data_frame(x = c(1, 4))
p3 <- data_frame(y = c(2, 2, 2, 3),
z = c(5, 4, 3, 2))

将它们放在一个嵌套的数据框中

我试图将我的数据保持在一个漂亮、整洁的矩形中。 “id”变量是函数名本身(在我的真实数据中,有数百个):
df <- data_frame(fun_id = c('f1', 'f2', 'f3'), 
params = list(p1, p2, p3),
funs = list(f1, f2, f3))

检查结构向我们展示了 params 的列表列和 funs :
print(df)

# A tibble: 3 x 3
fun_id params funs
<chr> <list> <list>
1 f1 <tibble [5 x 3]> <fun>
2 f2 <tibble [2 x 1]> <fun>
3 f3 <tibble [4 x 2]> <fun>

我的问题

使用 purrr函数,也许 dplyr::mutate , 如何在 df 中获得新的列表列叫 results其中每个元素是一个列表,其中包含执行 funs 中的函数的输出。参数取自 params ,以行方式?

我可以得到 pmap为一个简单的案例做我想做的事:
> pmap(.l = p1, .f = f1)

[[1]]
[1] 3

[[2]]
[1] 5

[[3]]
[1] 7

[[4]]
[1] 11

[[5]]
[1] 16

但我真的很想在数据框中执行此操作以保持一切正常。以下让我找到了正确的结构(一个带有结果列表列的数据框),但仅适用于一行,并且没有概括:
> df %>% 
slice(1) %>%
mutate(results = list(pmap(.l = params[[1]], .f = funs[[1]])))

# A tibble: 1 x 4
fun_id params funs results
<chr> <list> <list> <list>
1 f1 <tibble [5 x 3]> <fun> <list [5]>

预先感谢您帮助解决我的问题!

附言我查看了以下资源,但还没有找到答案:

purrr::pmap with dplyr::mutate

Using purrr::pmap within mutate to create list-column

http://statwonk.com/purrr.html

https://github.com/rstudio/cheatsheets/raw/master/purrr.pdf

https://jennybc.github.io/purrr-tutorial/index.html

最佳答案

purrr中有一个方便的功能对于这种情况;将函数列表应用于相应的参数列表!它叫invoke_map并且可以与 mutate 一起使用如下。我认为主要优势超过 map2(~pmap())是如果有额外的参数提供给任何未包含在 params 中的函数您可以将它们添加为 ... 中的命名参数而不是需要修改 params .

library(tidyverse)
f1 <- function(a, b, c) {a + b^c}
f2 <- function(x) {x * 2}
f3 <- function(y, z) {y * z}
p1 <- data_frame(
a = c(2, 4, 5, 7, 8),
b = c(1, 1, 2, 2, 2),
c = c(.5, 5, 1, 2, 3)
)
p2 <- data_frame(x = c(1, 4))
p3 <- data_frame(
y = c(2, 2, 2, 3),
z = c(5, 4, 3, 2)
)
df <- data_frame(
fun_id = c("f1", "f2", "f3"),
params = list(p1, p2, p3),
funs = list(f1, f2, f3)
)

df2 <- df %>%
mutate(results = invoke_map(.f = funs, .x = params))
df2
#> # A tibble: 3 x 4
#> fun_id params funs results
#> <chr> <list> <list> <list>
#> 1 f1 <tibble [5 x 3]> <fn> <dbl [5]>
#> 2 f2 <tibble [2 x 1]> <fn> <dbl [2]>
#> 3 f3 <tibble [4 x 2]> <fn> <dbl [4]>
df2$results
#> [[1]]
#> [1] 3 5 7 11 16
#>
#> [[2]]
#> [1] 2 8
#>
#> [[3]]
#> [1] 10 8 6 6

创建于 2018-07-13 由 reprex package (v0.2.0)。

关于r - 在具有不同参数的数据框中每行应用/映射不同的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51329813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com