2010-11-12 32 views
7

Disons que j'ai un data.frameComment trier les données dans R avec la conservation de l'ordre des colonnes spécifié?

x <- data.frame(a = c('A','A','A','A','A', 'C','C','C','C', 'B','B','B'), 
       b = c('a','c','a','a','c', 'd', 'e','e','d', 'b','b','b'), 
       c = c(7, 3, 2, 4, 5, 3, 1, 1, 5, 5, 2, 3), 
       stringsAsFactors = FALSE) 

> x 
    a b c 
1 A a 7 
2 A c 3 
3 A a 2 
4 A a 4 
5 A c 5 
6 C d 3 
7 C e 1 
8 C e 1 
9 C d 5 
10 B b 5 
11 B b 2 
12 B b 3 

Je voudrais trier x par des colonnes b et c mais maintien de l'ordre d'un comme avant. x[order(x$b, x$c),] - Interrompt l'ordre de la colonne a. C'est ce que je veux:

a b c 
3 A a 2 
4 A a 4 
1 A a 7 
2 A c 3 
5 A c 5 
6 C d 3 
9 C d 5 
7 C e 1 
8 C e 1 
11 B b 2 
12 B b 3 
10 B b 5 

Y at-il un moyen rapide de le faire?

Actuellement, je lance une boucle "for" et trier chaque sous-ensemble, je suis sûr qu'il doit y avoir un meilleur moyen.

Merci! Ilya

Répondre

7

Si la colonne "a" est commandé déjà, sa ce simple:

> x[order(x$a,x$b, x$c),] 
    a b c 
3 A a 2 
4 A a 4 
1 A a 7 
2 A c 3 
5 A c 5 
6 B d 3 
9 B d 5 
7 B e 1 
8 B e 1 
11 C b 2 
12 C b 3 
10 C b 5 

Si la colonne est un pas ordonnée (mais est groupée), créez un nouveau facteur avec les niveaux de x $ un et l'utiliser.

+0

colonne "a" pas ordonnée, mais groupés. L'ordre de "a" dans data.frame est important. – ilya

+0

cela signifie que x $ a sera d'abord trié puis x $ b basé sur x $ a, puis x $ c basé sur x $ a et x $ b, n'est-ce pas? – jazzz

0

Merci Spacedman! Votre recommandation fonctionne bien.

x$a <- factor(x$a, levels = unique(x$a), ordered = TRUE) 
x[order(x$a,x$b, x$c),] 

Après le commentaire de Gavin

x$a <- factor(x$a, levels = unique(x$a)) 
    x[order(x$a,x$b, x$c),] 
+0

obv qui échoue si x $ a est B B A A C C A D D D - mais si c'est complètement groupé alors vous avez terminé. – Spacedman

+0

dans mon ensemble de données il ne pouvait pas être la séparation dans les groupes. – ilya

+0

Je pense que vous avez une mauvaise idée des facteurs. La commande Spacedman visée commandait dans les niveaux. 'ordered ordered = TRUE' produit un facteur ** ordered **, qui est un type particulier de facteur pour lequel il existe un ordre semi-quantitatif. Ce type de facteur n'est pas pertinent pour le problème ici. –

0
require(doBy) 
orderBy(~ a + b + c, data=x) 
+0

Celui-ci changera l'ordre de la colonne a – ilya