2014-09-09 1 views
1

Я пытаюсь использовать dplyr и символ%>% с несколькими выделениями. Что работает:пытаясь использовать select в dplyr более компактным образом

select(data, b1:b10)/select(data, v1:v10) 

Что я хотел бы сделать:

data %>% select(b1:b10)/select(v1:v10) 
+0

Таким образом, ':' выбирает на основе порядка столбцов в 'data', а не на основе соответствия шаблонов? Похоже, потенциал для включения переменных, которые вы не имели в виду. – thelatemail

+0

'b1: b10' выбирает все столбцы от' b1' до 'b10' – Alex

+0

@Alex - выбор выбора по имени столбца возможен в R, позиционный выбор кажется довольно неуклюжим для текущей задачи. Что делать, если кто-то/что-то перемещает или добавляет столбец? – thelatemail

ответ

1

насчета

#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 один раз. Так и есть.

+0

Спасибо за все альтернативы! Я попробую их всех. –

Смежные вопросы