Sie können diese Art von Teilmenge nicht mit machen $
. Im Quellcode ( R/src/main/subset.c
) heißt es:
/ * Der Operator $ subset.
Wir müssen sicher sein, nur das erste Argument zu bewerten.
Das zweite Symbol ist ein Symbol, das abgeglichen und nicht ausgewertet werden muss.
* /
Zweites Argument? Was?! Sie müssen erkennen , dass $
, wie alles andere in R (einschließlich zum Beispiel (
, +
, ^
etc) ist eine Funktion, die ausgewertet Argumente und nimmt. df$V1
könnte umgeschrieben werden als
`$`(df , V1)
oder in der Tat
`$`(df , "V1")
Aber...
`$`(df , paste0("V1") )
... zum Beispiel wird niemals funktionieren, noch wird irgendetwas anderes, das zuerst im zweiten Argument bewertet werden muss. Sie dürfen nur eine Zeichenfolge übergeben, die niemals ausgewertet wird.
Verwenden Sie stattdessen [
(oder [[
wenn Sie nur eine einzelne Spalte als Vektor extrahieren möchten).
Beispielsweise,
var <- "mpg"
#Doesn't work
mtcars$var
#These both work, but note that what they return is different
# the first is a vector, the second is a data.frame
mtcars[[var]]
mtcars[var]
Sie können die Bestellung ohne Schleifen ausführen, indem Sie do.call
den Aufruf an erstellen order
. Hier ist ein reproduzierbares Beispiel unten:
# set seed for reproducibility
set.seed(123)
df <- data.frame( col1 = sample(5,10,repl=T) , col2 = sample(5,10,repl=T) , col3 = sample(5,10,repl=T) )
# We want to sort by 'col3' then by 'col1'
sort_list <- c("col3","col1")
# Use 'do.call' to call order. Seccond argument in do.call is a list of arguments
# to pass to the first argument, in this case 'order'.
# Since a data.frame is really a list, we just subset the data.frame
# according to the columns we want to sort in, in that order
df[ do.call( order , df[ , match( sort_list , names(df) ) ] ) , ]
col1 col2 col3
10 3 5 1
9 3 2 2
7 3 2 3
8 5 1 3
6 1 5 4
3 3 4 4
2 4 3 4
5 5 1 4
1 2 5 5
4 5 3 5
Wenn ich das richtig verstehe, haben Sie einen Vektor mit Variablennamen und möchten jeden Namen durchlaufen und Ihren Datenrahmen danach sortieren. In diesem Fall sollte dieses Beispiel eine Lösung für Sie darstellen. Das Hauptproblem bei Ihnen (das vollständige Beispiel ist nicht vollständig, daher bin ich mir nicht sicher, was Sie sonst noch vermissen könnten) ist, dass es
order(Q1_R1000[,parameter[X]])
stattdessen sein sollteorder(Q1_R1000$parameter[X])
, da Parameter ein externes Objekt ist, das einen Variablennamen enthält, der einer direkten Spalte entgegengesetzt ist Ihres Datenrahmens (was, wenn das$
angemessen wäre).quelle
Die Verwendung von dplyr bietet eine einfache Syntax zum Sortieren der Datenrahmen
Es kann nützlich sein, die hier gezeigte NSE-Version zu verwenden, um die Sortierliste dynamisch erstellen zu können
quelle
Eine andere Lösung ist die Verwendung von #get:
quelle
Hatte ein ähnliches Problem aufgrund einiger CSV-Dateien, die verschiedene Namen für dieselbe Spalte hatten.
Dies war die Lösung:
Ich habe eine Funktion geschrieben, um den ersten gültigen Spaltennamen in einer Liste zurückzugeben, und dann diese ...
quelle
Wenn Sie eine Spalte mit einem bestimmten Namen auswählen möchten, tun Sie dies einfach
Sie können es auch in umgekehrter Schleife ausführen, um einen dynamischen Namen hinzuzufügen. Wenn beispielsweise A ein Datenrahmen und xyz eine Spalte ist, die als x bezeichnet werden soll, gefällt mir dies
Auch dies kann auch in einer Schleife hinzugefügt werden
quelle
quelle
zu spät .. aber ich denke ich habe die Antwort -
Hier ist mein Beispiel Study.df Datenrahmen -
Und dann -
quelle