2014-08-01 8 views
3

название описывает довольно много, что я хочу:dplyr :: Manip: Как использовать строковые аргументы (удерживая COLNAMES) вместо имен столбцов

вместо:

filter(mtcars, cyl == 8) 

Я хотел бы использовать:

var <- "cyl" 
filter(mtcars, var == 8) # pseudocode 

так же, как

mtcars[which(mtcars[,var]==8),] 

Я вижу, что есть такие функции, как starts_with() , но ИМХО нет действительно подходит для выше довольно простого приложения.

+0

только что видел, что это несколько связанных с http://stackoverflow.com/questions/21208801/ group-by-multiple-columns-in-dplyr-using-string-vector-input – Janhoo

+0

В настоящее время это не поддерживается, но я над этим работаю: https://github.com/hadley/dplyr/issues/352 – hadley

+0

Это теперь функция i mplemented. Обходной путь не требуется. Чтобы обойти нестандартную оценку, используйте аромат 'manip _()', например. 'Фильтр (_)'. 'vignette (« nse »)' подробно описывает это. Спасибо @hadley – Janhoo

ответ

3

Попробуйте это:

mtcars %>% do(filter(., .[[var]] == 8)) 
2
eval(substitute(filter(mtcars, var == 8),list(var=as.name(var))))%>% 
head(2) 
# mpg cyl disp hp drat wt qsec vs am gear carb 
# 1 18.7 8 360 175 3.15 3.44 17.02 0 0 3 2 
# 2 14.3 8 360 245 3.21 3.57 15.84 0 0 3 4 

filter(mtcars, get(var, envir=as.environment(mtcars)) == 8) #should also work but not recommended 
+0

От вас ответ я заключаю, что в настоящее время dplyr не поддерживает строковые аргументы. Правильно? – Janhoo

+0

@ Джан, Да, если я не ошибаюсь. – akrun

+0

Ну, тогда этот вопрос отвечает на мой вопрос. Хотя это не очень удовлетворительно. @akrun Не ваша вина. Спасибо друг. – Janhoo

0

Вот еще один способ с do.call:

do.call(filter, list(mtcars, bquote(.(as.name(var)) == 8)))