Pass ein Vektor von Variablen-Namen zu organisieren() in dplyr
Möchte ich weitergeben arrange()
{dplyr} ein Vektor von Variablen-Namen zu Sortieren. In der Regel, die ich geben Sie nur die Variablen, die ich will, aber ich bin versucht zu machen, eine Funktion, bei der Sortierung von Variablen eingegeben werden können als Funktions-parameter.
df <- structure(list(var1 = c(1L, 2L, 2L, 3L, 1L, 1L, 3L, 2L, 4L, 4L
), var2 = structure(c(10L, 1L, 8L, 3L, 5L, 4L, 7L, 9L, 2L, 6L
), .Label = c("b", "c", "f", "h", "i", "o", "s", "t", "w", "x"
), class = "factor"), var3 = c(7L, 5L, 5L, 8L, 5L, 8L, 6L, 7L,
5L, 8L), var4 = structure(c(8L, 5L, 1L, 4L, 7L, 4L, 3L, 6L, 9L,
2L), .Label = c("b", "c", "d", "e", "f", "h", "i", "w", "y"),
class = "factor")), .Names = c("var1", "var2", "var3", "var4"),
row.names = c(NA, -10L), class = "data.frame")
# this is the normal way to arrange df with dplyr
df %>% arrange(var3, var4)
# but none of these (below) work for passing a vector of variables
vector_of_vars <- c("var3", "var4")
df %>% arrange(vector_of_vars)
df %>% arrange(get(vector_of_vars))
df %>% arrange(eval(parse(text = paste(vector_of_vars, collapse = ", "))))
- Imo, die Verwendung von %>% gespeichert werden sollen, die für die Verkettung, wie es ist ziemlich hässlich... (für einzelne Aktionen < oder = läuft einwandfrei...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hadley hat Sie nicht gemacht, diese offensichtlich in der Hilfe-Datei nur in seinem NSE-vignette. Die Versionen von den Funktionen gefolgt durch Unterstriche verwenden Sie die standard-evaluation, so dass Sie geben Sie Vektoren von strings und dergleichen.
Wenn ich verstehe dein problem korrekt, können Sie einfach ersetzen
arrange()
mitarrange_()
und es wird funktionieren.Speziell, übergeben Sie den Vektor von strings als
.dots
argument, wenn Sie es tun.========== Update März 2018 ==============
Unter Verwendung der standard-Demo-Versionen in dplyr, wie ich Sie hier gezeigt haben ist jetzt als veraltet betrachtet. Sie können Lesen Hadley ' s programming vignette für den neuen Weg. Im Grunde verwenden Sie
!!
zu unquote eine variable oder!!!
zu unquote ein Vektor von Variablen innerhalb vonarrange()
.Wenn Sie übergeben die Spalten, die, wenn Sie bloß sind, zitieren Sie diese mit
quo()
für eine variable oderquos()
für einen Vektor. Verwenden Sie nicht die Anführungszeichen. Siehe die Antwort von Akrun.Wenn Ihre Spalten sind schon strings, dann machen Sie die Namen mit
rlang::sym()
für eine einzelne Spalte oderrlang::syms()
für einen Vektor. Siehe die Antwort von Christos. Sie können auchas.name()
für eine einzelne Spalte. Leider als des Schreibens dieses Artikels, die Informationen zu verwendenrlang::sym()
noch nicht in der vignette habe ich den link zu oben (schließlich wird es im Abschnitt "variadic quasiquotation" nach seinem Entwurf).df %>% arrange_(vector_of_vars)
scheint es zu ignorieren, das zweite element und sortiert sich nur auf das erste element. Allerdings, wenn Siedf %>% arrange_(vector_of_vars[1], vector_of_vars[2])
, dann sortiert Sie auf beide Werte. Ich nehme an, es gibt eine elegantere Lösung als die zweite Methode, aber ich bin mir nicht sicher, was es ist.arrange_()
scheint zu ignorieren, in der zweiten Spalte. @eipi10 deine Lösung funktionieren würde, aber das problem ist, dass es kann beliebig viele Elemente invector_of_vars
.df %>% arrange_(.dots = vector_of_vars)
. farnsy, wenn Sie diese änderung vornehmen, ich gebe Ihnen Kredit für die Antwortvector_of_vars <- c("desc(var3)", "var4");df %>% arrange_(.dots=vector_of_vars)
In der neuen version (die bald veröffentlicht werden
0.6.0
vondplyr
) wir können diequosures
Wenn es mehr als eine variable, die wir verwenden
quos
und für eine einzelne variable ist esquo
. Diequos
zurücklist
zitiert von Variablen und innenarrange
wir unquote dielist
mit!!!
für die Bewertung1: Unquoting language objects with '!!!' is soft-deprecated as of rlang 0.3.0. Please use '!!' instead.
Es ist unfassbar (höflich zu bleiben), wie viele Funktionen sind ständig veraltet in der tidyverse... ich gehe zurück zur Basis R für meine langfristigen code denke ich...In der quosures Geist:
Für einzelne Variablen, es würde wie folgt Aussehen:
Versuchen Sie dies:
und eigentlich kann dies geschrieben werden mehr einfach wie:
obwohl an dieser Stelle ich denke, es ist die gleiche wie farnsy die implizierten Lösung.