【发布时间】:2019-12-13 06:02:37
【问题描述】:
这不是问题的重复,例如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 清理这段代码?
【问题讨论】:
-
你能添加你期望的输出吗?
-
我发现其中一些取决于列的顺序是否与参数进入函数的顺序一致,或者您是使用所有列还是仅使用其中一些列。对于您使用所有列的简单示例,您可以执行类似
bar2 = function(...) mean(c(...))的操作 -
@aosmith 这只是我选择的示例的人工制品——通常我需要能够按名称引用列并以不同的方式使用它们,而不是使用
...作为包罗万象。
标签: r parameter-passing rows purrr pmap