gpt4 book ai didi

R:purrr:使用 pmap 进行逐行操作,但这次涉及很多列

转载 作者:行者123 更新时间:2023-12-02 00:14:48 24 4
gpt4 key购买 nike

这不是重复的问题,例如Row-wise iteration like apply with purrr

我了解如何使用 pmap() 对数据框执行逐行操作:

library(tidyverse)

df1 = tribble(~col_1, ~col_2, ~col_3,
1, 5, 12,
9, 3, 3,
6, 10, 7)

foo = function(col_1, col_2, col_3) {
mean(c(col_1, col_2, col_3))
}

df1 %>% pmap_dbl(foo)

这给出了应用于每一行的函数 foo:

[1] 6.000000 5.000000 7.666667

但是当我有多个列时,这会变得非常笨拙,因为我必须显式地传递它们。如果我说,我的数据框 df2 中有 8 列,我想应用一个可能涉及这些列中的每一列的函数 bar 怎么办?

set.seed(12345)
df2 = rnorm(n=24) %>% matrix(nrow=3) %>% as_tibble() %>%
setNames(c("col_1", "col_2", "col_3", "col_4", "col_5", "col_6", "col_7", "col_8"))

bar = function(col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8) {
# imagine we do some complicated row-wise operation here
mean(c(col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8))
}

df2 %>% pmap_dbl(bar)

给予:

[1]  0.45085420  0.02639697 -0.28121651

这显然是不够的——我必须为每一列添加一个新参数到 bar。这是大量的输入,它使代码的可读性更差且更脆弱。似乎应该有一种方法让它接受一个参数 x,然后通过 x$col_1 等访问我想要的变量。或者比以上无论如何。有什么方法可以使用 purrr 清理这段代码吗?

最佳答案

您可以使用 ...和 en- list一旦他们在你的职能中。

dot_tester <- function(...) {
dots <- list(...)
dots$Sepal.Length + dots$Petal.Width
}

purrr::pmap(head(iris), dot_tester)
[[1]]
[1] 5.3

[[2]]
[1] 5.1

[[3]]
[1] 4.9

[[4]]
[1] 4.8

[[5]]
[1] 5.2

[[6]]
[1] 5.8

但是,这不会改变您的代码的“脆弱性”,因为您仍然明确且准确地需要将您的列名称与函数中的名称相匹配。好处是不必在 <- function() 中列出它们打电话。

关于R:purrr:使用 pmap 进行逐行操作,但这次涉及很多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57363245/

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