2014-11-20 5 views
5

Jak mogę użyć numeru dplyr::arrange(dplyr::desc()) i podać ciąg znaków jako nazwę kolumny?Jak korzystać z dplyr :: arrange (desc()), gdy używasz ciągu jako nazwy kolumny?

Oto przykładowy zestaw danych:

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

Przykłady, które działają:

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

Ale nie wydaje się użyć ciąg z obu arrange i desc, są to dwa wersja I Próbowałem, że nie działa:

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

Dzięki!

+1

Może być taki: 'df%>% dplyr :: arrange (dplyr :: desc (df ["b"])) "? Szczerze mówiąc, nie jestem pewien ... – KFB

+0

Musisz użyć interp – hadley

+0

Dzięki za wskazówki i wyniki dupek, ale nadal nie mogę dowiedzieć się, jak korzystać z interp (z pakietu lazyeval?), Aby ten prosty przykład działa. Będę nadal próbował zrozumieć NSE, ale byłoby wspaniale, gdybyś mógł również opublikować rozwiązanie, jeśli nie zajmie ci to zbyt dużo czasu. Wielkie dzięki i tak –

Odpowiedz

1

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

Przede wszystkich standardowych ocenach dplyr czasowników są przestarzałe, więc zamiast:

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

jest obecnie zaleca się wpisać:

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

lub:

df %>% arrange(UQ(sym(x))) 

gdzie sym, !! i UQ pochodzą z rlang opakowaniu.

Zobacz ?arrange_, łączy się z tematem pomocy o nazwie Deprecated SE versions of main verbs. i oferuje kilka szczegółów.

Stamtąd sortowanie malejące łatwo jest dostosować nowe sformułowanie:

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

Ale to działa prawidłowo, a także:

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

FYI, aby pracować z arrange_ moglibyśmy zrobić co następuje. Nie są to zalecane metody, ale proces myślenia jest interesujący.

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

które mogą być uproszczone, jeżeli mamy zmienne liczbowe, takie jak w przykładzie OP:

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

lub korzystając lazyeval::interp

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

Albo jak @ Shyam-saladi proponuje:

desc_ <- function(x) lazyeval::interp(~desc(var), var = as.name(x)) 
# or just 
# desc_ <- function(x) paste0("desc(",x,")") 
df %>% arrange_(desc_(x)) 
Powiązane problemy