2010-01-08 5 views
0

J'ai posé cette question et a reçu une solution, mais mon problème est quelque peu varié de l'explication originaleTrier intérieur avec R - Une fois par numérique puis par Alpha (V2)

J'ai une trame de données, comme celui-ci :

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

« Société a: d » = données à partir de 2010, « Société a 09: d: 09 » = données à partir de 2009. Je voudrais que ce soit d'abord trié 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:

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

Il y a eu quelques suggestions de this question, mais je ne peux pas le reproduire pour cela, un peu plus exemple compliqué. J'ai envoyé quelques test data.

+0

Pourquoi les 09 données ont une valeur différente « » nums des autres données, et pourquoi ne vous choisissez de commander par le « élément plutôt que le » « élément 09 » dans chaque groupe? –

+0

Une autre question serait: pouvez-vous avoir "10" au lieu de ""? – Shane

+0

@Alex, @Shane, le besoin se résume à afficher. Organiser les données de cette façon me permet de copier/coller plutôt que de trier manuellement une grande liste. –

Répondre

2

Que pensez-vous de cela?

## Read in the data 
foo <- read.csv("testdata.csv") 
## Normalize names so that things work later. 
foo$Company <- toupper(gsub(" *$", "", foo$Company)) 

## Split the data into 09 and not 09. 
not.09 <- subset(foo, !grepl("09$", Company)) 
is.09 <- subset(foo, grepl("09$", Company)) 

## Figure out where the not09 should go (even indices) 
not.09$Index <- 2 * order(not.09$Score, decreasing=TRUE) 

## Find out where the 09s should go (odd indices) 
is.09$Index <- not.09[match(is.09$Company, paste(not.09$Company, "09")),]$Index + 1 

## Combine and sort 
combined <- rbind(is.09, not.09) 
combined <- combined[order(combined$Index),-4] 
+0

Celui-ci fonctionne! merci pour les commentaires détaillés aussi! –