Передайте вектор имен переменных, чтобы упорядочить () в dplyr

Я хочу передать arrange() {dplyr} вектор имен переменных для сортировки. Обычно я просто ввожу нужные переменные, но я пытаюсь создать функцию, в которой переменные сортировки могут вводиться как параметр функции.

 df % arrange(var3, var4) # but none of these (below) work for passing a vector of variables vector_of_vars % arrange(vector_of_vars) df %>% arrange(get(vector_of_vars)) df %>% arrange(eval(parse(text = paste(vector_of_vars, collapse = ", ")))) 

Хэдли не сделал этого очевидным в файле справки – только в своей виньетике NSE. В версиях функций, за которыми следуют символы подчеркивания, используется стандартная оценка, поэтому вы передаете им векторы строк и тому подобное.

Если я правильно понимаю вашу проблему, вы можете просто заменить arrange_() и она будет работать.

В частности, передайте вектор строк как аргумент .dots когда вы это сделаете.

 > df %>% arrange_(.dots=c("var1","var3")) var1 var2 var3 var4 1 1 i 5 i 2 1 x 7 w 3 1 h 8 e 4 2 b 5 f 5 2 t 5 b 6 2 w 7 h 7 3 s 6 d 8 3 f 8 e 9 4 c 5 y 10 4 o 8 c 

========== Обновление марта 2018 года ==============

Использование стандартных оценочных версий в dplyr, как я показал здесь , теперь считается устаревшим . Вы можете прочитать виньетку Хэдли по новому пути. В основном вы будете использовать !! для unquote одной переменной или !!! для unquote вектора переменных внутри arr arrange() .

Когда вы передаете эти столбцы, если они голые, укажите их с помощью quo() для одной переменной или quos() для вектора. Не используйте кавычки. См. Ответ от Akrun.

Если ваши столбцы уже являются строками, rlang::sym() их имена с помощью rlang::sym() для одного столбца или rlang::syms() для вектора. См. Ответ Кристоса. Вы также можете использовать as.name() для одного столбца. К сожалению, на момент написания этой статьи информация о том, как использовать rlang::sym() еще не попала в виньетку, на которую я ссылаюсь выше (в конце концов это будет в разделе о «вариационной квазикотации» в соответствии с его проектом).

В новой версии (скоро будет выпущено 0.6.0 из dplyr ) мы можем использовать quosures

 library(dplyr) vector_of_vars <- quos(var1, var3) df %>% arrange(!!! vector_of_vars) # var1 var2 var3 var4 #1 1 i 5 i #2 1 x 7 w #3 1 h 8 e #4 2 b 5 f #5 2 t 5 b #6 2 w 7 h #7 3 s 6 d #8 3 f 8 e #9 4 c 5 y #10 4 o 8 c 

Когда имеется более одной переменной, мы используем quos а для одной переменной это quo . quos вернет list цитируемых переменных и внутри arrange , мы исключаем list используя !!! для оценки

В духе quosures:

 df %>% arrange(!!! rlang::syms(c("var1", "var3"))) 

Для одной переменной она будет выглядеть так:

 df %>% arrange(!! rlang::sym(c("var1"))) 

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

 df %>% do(do.call(arrange_, . %>% list(.dots = vector_of_vars))) 

и на самом деле это можно записать проще:

 df %>% arrange_(.dots = vector_of_vars) 

хотя на данный момент я думаю, что это то же самое, что подразумевалось в решении Farnsy.

  • Как сделать 2 сопоставимых метода только в одном classе?
  • Почему в Java нет SortedList?
  • Как отсортировать список словарей по значению словаря в Python?
  • сортировка целых чисел в порядке от самого низкого до самого высокого java
  • Как сортировать аррайалист объектов по свойству?
  • Функция сортировки массива VBA?
  • Как объяснить сортировку (численное, лексикографическое и сопоставление) с примерами для нетехнических тестеров?
  • Правильно ли упорядочен порядок std :: pair ?
  • c ++ сортировка, отслеживающая индексы
  • Radix Sort, реализованный в C ++
  • Как отсортировать вектор символа, где элементы содержат буквы и числа в R?
  • Давайте будем гением компьютера.