2016-06-30 9 views
0

Ich möchte die Daten x (hier: 1:12) nach den Sektoren sec und Teilsektoren ssec sortieren. Unten sehen Sie ein Beispiel, wie dies gemacht werden kann. Die Frage ist, ob das eleganter gemacht werden kann (vielleicht mit einer Base-R-Funktion/ohne zusätzliche Pakete)? Wie werden Daten nach Sektoren und Teilsektoren sortiert?

## Data 
set.seed(17) 
(sec <- sample(rep(LETTERS[1:3], each = 4))) # 3 sectors 
(ssec <- rep(sample(1:4, 12, replace = TRUE))) # 4 subsectors 
x <- 1:12 # data to sort according to increasing sectors and subsectors 

## Sort according to sectors 
ord <- order(sec) 
x. <- x[ord] 
sec. <- sec[ord] 
ssec. <- ssec[ord] 

## Sort according to subsectors 
usec. <- unique(sec.) 
x.. <- x. 
ssec.. <- ssec. 
for(grp in usec.) { 
    ii <- sec. == grp # indices of components in that sector 
    ord. <- order(ssec.[ii]) 
    x..[ii] <- x.[ii][ord.] 
    ssec..[ii] <- ssec.[ii][ord.] 
} 

## Result 
x.. 
sec. 
ssec.. 
+0

Sie können mehrere Variablen übergeben, um nach der Funktion 'order()' zu sortieren. beispielsweise. 'x [Reihenfolge (Sek., Sek.)]', ist das, was Sie brauchen? – Psidom

+0

* Argh *, wahr ... Sehr gut, danke! Ich glaube ich habe das vor einigen Jahren benutzt und dann vergessen ... hatte das Gefühl, dass es eine elegantere Lösung gab :-) Danke nochmal. –

+0

@Psidom, warum nicht eine offizielle Antwort geben? – gung

Antwort

1

order Die Funktion von base R akzeptiert auch mehrere Argumente. Von ?order:

order gibt eine Permutation, die in auf- oder absteigender Reihenfolge erstes Argument umlagert, Bindungen durch weitere Argumente zu brechen.

Um zu zeigen, können wir überprüfen, wie order(sec, ssec) Art der Sektor und Teilsektor

Hier das Original sec und ssec ist:

sec 
[1] "B" "C" "A" "B" "A" "B" "C" "C" "C" "A" "B" "A" 
ssec 
[1] 3 1 3 2 1 2 4 1 3 2 1 4 

Nach der Anwendung des geordneten Index wird sec alphabetisch und ssec sortiert ist innerhalb jeder Sekunde sortiert, was bedeutet, dass der Index order(sec, ssec) der Sortierindex erwartet wird:

sec[order(sec, ssec)] 
[1] "A" "A" "A" "A" "B" "B" "B" "B" "C" "C" "C" "C" 
ssec[order(sec, ssec)] 
[1] 1 2 3 4 1 2 2 3 1 1 3 4 
Verwandte Themen