[英]R - Passing arguments to `dplyr::select()` inside a wrapper
[英]dplyr::select Passing a range of variables to wrapper function containing dplyr::select
我想創建一個使用dplyr
的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,以尋求對是否可以解決但看不到解決方案或是否有解決方案的一些見解。使用例如“ p_1:q_1”的情況以及例如“ starts_with('p')”的情況。
正如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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.