我想创建一个使用dplyr
' s select
选择列的函数,然后在所选列的行上应用任意函数。
这是我的尝试:
aggregate <- function(Df, selection, fun=sum){
select(Df, selection) %>% apply(1, fun)
}
它适用于select
助手:
set.seed(42)
N <- 10
Df <- tibble(p_1 = rnorm(N),
p_2 = rnorm(N),
q_1 = rnorm(N),
q_2 = rnorm(N))
# mean over p_1 and p_2
aggregate(Df, starts_with('p'), mean)
# max over p_1 and q_1
aggregate(Df, ends_with('1'), max)
# sum over p_1, p_2, q_1, q_2
aggregate(Df, everything())
然而,虽然我们可以做到
select(Df, p_1:q_2) %>% apply(1, mean)
这不起作用
aggregate(Df, p_1:q_1, mean)
Error in overscope_eval_next(overscope, expr) : object 'p_1' not found
我已经阅读了http://dplyr.tidyverse.org/articles/programming.html,以便了解是否可以解决此问题,但无法查看解决方案或查看是否有解决方案可以让我使用例如&#34; P_1:Q_1&#34;案例以及案例&#34; STARTS_WITH(&#39; P&#39)&#34;案件。
答案 0 :(得分:0)
根据Mikko Marttila的建议,我认为就像使用enquo
和!!
一样简单。
library(tibble)
library(rlang)
library(dplyr)
aggregate <- function(Df, variable_selection, fun=sum){
.variable_selection <- enquo(variable_selection)
select(Df, !!.variable_selection) %>% apply(1, fun)
}
set.seed(42)
N <- 10
Df <- tibble(p_1 = rnorm(N),
p_2 = rnorm(N),
q_1 = rnorm(N),
q_2 = rnorm(N))
这些工作和以前一样好:
aggregate(Df, starts_with('p'), min)
aggregate(Df, ends_with('_1'), max)
aggregate(Df, everything(), mean)
现在这也很好。
aggregate(Df, p_1:q_1, max)