Ich habe mit dem folgenden Beispiel das Konzept von order
gelernt, was mich dann lange Zeit verwirrt hat:
set.seed(1234)
ID = 1:10
Age = round(rnorm(10, 50, 1))
diag = c("Depression", "Bipolar")
Diagnosis = sample(diag, 10, replace=TRUE)
data = data.frame(ID, Age, Diagnosis)
databyAge = data[order(Age),]
databyAge
Der einzige Grund, warum dieses Beispiel funktioniert, ist, weil order
nach dem Vektor Age
sortiert und nicht nach der Spalte namens Age
im Datenrahmen data
.
Um dies zu sehen, erstelle einen identischen Datenrahmen mit read.table
und leicht unterschiedlichen Spaltennamen ohne Verwendung der oben genannten Vektoren:
my.data <- read.table(text = '
id age diagnosis
1 49 Depression
2 50 Depression
3 51 Depression
4 48 Depression
5 50 Depression
6 51 Bipolar
7 49 Bipolar
8 49 Bipolar
9 49 Bipolar
10 49 Depression
', header = TRUE)
Die oben genannte Struktur für order
funktioniert nicht mehr, weil es keinen Vektor namens age
gibt:
databyage = my.data[order(age),]
Die folgende Zeile funktioniert, weil order
nach der Spalte age
in my.data
sortiert.
databyage = my.data[order(my.data$age),]
Ich dachte, es sei sinnvoll, dies zu posten, da ich lange Zeit von diesem Beispiel verwirrt war. Wenn dieser Beitrag nicht für den Thread geeignet ist, kann ich ihn entfernen.
BEARBEITEN: 13. Mai 2014
Nachfolgend finden Sie eine verallgemeinerte Methode zum Sortieren eines Datensatzes nach jeder Spalte, ohne die Spaltennamen anzugeben. Der untenstehende Code zeigt, wie man von links nach rechts oder von rechts nach links sortiert. Dies funktioniert, wenn jede Spalte numerisch ist. Ich habe es noch nicht mit einer Zeichenkette probiert.
Ich habe den do.call
Code vor einem Monat oder zwei in einem alten Beitrag auf einer anderen Website gefunden, nach umfangreicher und schwieriger Suche. Ich bin mir nicht sicher, ob ich diesen Beitrag jetzt wiederfinden könnte. Der vorliegende Thread ist der erste Treffer für das Sortieren eines Datenrahmens
in R
. Daher dachte ich, dass meine erweiterte Version des ursprünglichen do.call
Codes nützlich sein könnte.
set.seed(1234)
v1 <- c(0,0,0,0, 0,0,0,0, 1,1,1,1, 1,1,1,1)
v2 <- c(0,0,0,0, 1,1,1,1, 0,0,0,0, 1,1,1,1)
v3 <- c(0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1)
v4 <- c(0,1,0,1, 0,1,0,1, 0,1,0,1, 0,1,0,1)
df.1 <- data.frame(v1, v2, v3, v4)
df.1
rdf.1 <- df.1[sample(nrow(df.1), nrow(df.1), replace = FALSE),]
rdf.1
order.rdf.1 <- rdf.1[do.call(order, as.list(rdf.1)),]
order.rdf.1
order.rdf.2 <- rdf.1[do.call(order, rev(as.list(rdf.1))),]
order.rdf.2
rdf.3 <- data.frame(rdf.1$v2, rdf.1$v4, rdf.1$v3, rdf.1$v1)
rdf.3
order.rdf.3 <- rdf.1[do.call(order, as.list(rdf.3)),]
order.rdf.3