Как использовать dplyr ::range (desc ()) при использовании строки в качестве имени столбца?

Как я могу использовать dplyr::arrange(dplyr::desc()) и передать строку в качестве имени столбца?

Вот образец набора данных:

df <- data.frame(a = 1:3, b = 3:1)

Примеры, которые работают:

df %>% dplyr::arrange(b)
df %>% dplyr::arrange_("b")
df %>% dplyr::arrange(dplyr::desc(b))

Но я не могу использовать строку одновременно с arrange и desc, это две версии, которые я пробовал, которые не работают:

df %>% dplyr::arrange(dplyr::desc("b"))
df %>% dplyr::arrange_(dplyr::desc("b"))

Спасибо!


person DeanAttali    schedule 20.11.2014    source источник
comment
Может быть так df %>% dplyr::arrange(dplyr::desc(df["b"]))? Честно говоря, я не уверен ...   -  person KFB    schedule 20.11.2014
comment
Вам нужно будет использовать interp   -  person hadley    schedule 20.11.2014
comment
Спасибо за советы и обнаруженные ошибки, но я все еще не могу понять, как использовать interp (из пакета lazyeval?), Чтобы заставить этот простой пример работать. Я буду продолжать пытаться понять NSE, но было бы замечательно, если бы вы также могли опубликовать решение, если это не займет у вас слишком много времени. В любом случае большое спасибо   -  person DeanAttali    schedule 21.11.2014
comment
Цитата из комментария Хенрика к моему удаленному ответу: df <- data.frame(a = 3:1, b = 1:3); Переменная для сортировки в виде строки: sort_var <- "b"; Затем воспользуйтесь примером из виньетки, на которую я ссылался: df %>% arrange_(interp(~desc(var), var = as.name(sort_var))) Также убедитесь, что вы сначала установили и загрузили пакет lazyeval.   -  person talat    schedule 22.11.2014
comment
Новая удобная функция desc_ <- function(x) { lazyeval::interp(~desc(var), var = as.name(x)) } хороша   -  person saladi    schedule 13.04.2017


Ответы (1)


tl; dr: df %>% arrange(desc(!!sym("b")))

Прежде всего, устарели стандартные вычисления dplyr глаголов, поэтому вместо:

library(dplyr)
x <- "b"
df %>% arrange_(x)

теперь рекомендуется ввести:

library(dplyr)
library(rlang)
df %>% arrange(!!sym(x))

См. ?arrange_, он ссылается на раздел справки Deprecated SE versions of main verbs. и предлагает некоторые подробности.

Отсюда для сортировки по убыванию легко адаптировать новую формулировку:

df %>% arrange(desc(!!sym(x)))

Они также работают, если ваши данные не сгруппированы:

df %>% arrange(desc(.[[x]]))
df %>% arrange(desc(.data[[x]]))

К вашему сведению, чтобы заставить его работать с arrange_, мы могли бы сделать следующее, однако лучше использовать подход, описанный выше!

df %>% arrange_(paste0("desc(",x,")"))

Что можно упростить, если у нас есть числовые переменные, как в примере OP:

df %>% arrange_(paste0("-",x))

Или используя lazyeval::interp

df %>% arrange_(interp(~desc(y),y=as.name(x)))

Или, как предлагает @ shyam-sali:

desc_ <- function(x) lazyeval::interp(~desc(var), var = as.name(x))
# or just
# desc_ <- function(x) paste0("desc(",x,")")
df %>% arrange_(desc_(x))
person Moody_Mudskipper    schedule 23.02.2018
comment
arrange_(desc_(x)) амортизируется с dplyr 0.7.0 - person vladiim; 11.05.2021