dplyr :: select将一系列变量传递给包含dplyr :: select的包装函数

时间:2018-03-21 19:13:26

标签: r dplyr

我想创建一个使用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;案件。

1 个答案:

答案 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)