насчета
#sample data
data<-data.frame(matrix(runif(20*45), ncol=20,
dimnames=list(NULL, paste0(rep(c("b","v"), each=10),1:10))))
#orig
A<-select(data, b1:b10)/select(data, v1:v10)
#proposed
B<-data %>% function(X) {select(X, b1:b10)/select(X, v1:v10)}
#verify they are the same
all(A==B)
У меня также есть вспомогательная функция под названием withX, что я использую много в ситуациях, как это
C <- data %>% withX(select(X, b1:b10)/select(X, v1:v10))
all(C==A)
# [1] TRUE
Или, может быть, в этом случае нам может понадобиться еще одна вспомогательная функция для работы цепочки и создания списка из разных подмножеств. Рассмотрим функцию each
each<-function(.data, ...) {
dots <- substitute(list(...))[-1]
force(.data)
e<-environment()
parent.env(e)<-parent.frame()
lapply(dots, function(x) {
eval(bquote(.data %>% .(x)), e)
})
}
Эта функция будет выполнять dplyr
цепочки для каждого параметра вы передаете. Так что вы можете сделать
D <- data %>% each(select(b1:b10), select(v1:v10)) %>% Reduce(`/`, .)
all(A==D)
# [1] TRUE
Теперь я понимаю, все эти альтернативные методы не являются «компактный» в смысл меньшего количества символов. Но вам нужно только указать имя data.frame один раз. Так и есть.
Таким образом, ':' выбирает на основе порядка столбцов в 'data', а не на основе соответствия шаблонов? Похоже, потенциал для включения переменных, которые вы не имели в виду. – thelatemail
'b1: b10' выбирает все столбцы от' b1' до 'b10' – Alex
@Alex - выбор выбора по имени столбца возможен в R, позиционный выбор кажется довольно неуклюжим для текущей задачи. Что делать, если кто-то/что-то перемещает или добавляет столбец? – thelatemail