2009-12-24 3 views
0

J'ai un data.frame, comme ceci:sorte intérieur avec R - Une fois par numérique puis par alpha

nums<-c(5,7,8,9,10,3,2,1) 
text<-c("a","b","c","d","a 09","b 09","c 09","d 09") 
this <- data.frame() 
this <- cbind(text,nums) 

"a" 5 
"b" 7 
"c" 8 
"d" 9 
"a 09" 10 
"b 09" 3 
"c 09" 2 
"d 09" 1 

a: d = données à partir de 2010, un 09: d: 09 = données de 2009. Je voudrais qu'il soit trié d'abord par la colonne numérique du plus grand au moins puis par la colonne de chaîne. Le seul hic est que la colonne de chaîne doit afficher les 09' données sous les données de 2010, comme celui-ci:

"d" 9 
"d 09" 1 
"c" 8 
"c 09" 2 
"b" 7 
"b 09" 3 
"a" 5 
"a 09" 10 
+0

Je ne sais pas ce que vous entendez John. Mais vous êtes invités à modifier, quelques années plus tard même. –

Répondre

2

Le paquet Deducer a une fonction de tri agréable pour data.frames:

> library(Deducer) 
> text<-c("a","b","c","d","a 09","b 09","c 09","d 09") 
> nums<-c(5,7,8,9,10,3,2,1) 
> t1<-sapply(text,function(x) strsplit(x," ")[[1]][1]) 
> t2<-sapply(text,function(x) strsplit(x," ")[[1]][2]) 
> dat<-data.frame(text,nums,t1,t2) 
> sort(dat,by=~-t1 -t2) 
    text nums t1 t2 
d  d 9 d <NA> 
d 09 d 09 1 d 09 
c  c 8 c <NA> 
c 09 c 09 2 c 09 
b  b 7 b <NA> 
b 09 b 09 3 b 09 
a  a 5 a <NA> 
a 09 a 09 10 a 09 
+0

Merci Ian, maintenant comment je le ferais si je devais le baser sur le fait que la colonne de texte avait juste "09" dedans plutôt qu'un espace (j'ai simplifié mon exemple mais vraiment a, b, c, d noms avec espaces et autres caractères). –

+1

grep ("09", texte) devrait vous diriger dans la bonne direction. –

+0

J'ai un peu de mal à mettre ça ensemble. grep ("09", texte) ne renvoie qu'un vecteur. Pourriez-vous fournir un exemple? –

1

Une suggestion:

Essayez ordre de marche() sur la première colonne, puis échanger chaque deux lignes en créant un index sur les index pairs et impairs séparément, et en les affectant respectivement à un nouveau vecteur.

Questions connexes