2010-07-23 8 views
1

J'essaie de trier itérativement les données dans les colonnes pour extraire N valeurs maximales. Mes données sont configurées avec les première et deuxième colonnes contenant les titres et les codes d'occupation, et toutes les autres colonnes contenant des valeurs comparatives (dans ce cas, les quotients d'emplacement qui devaient être calculés précédemment pour chaque ville) pour ces professions pour différentes villes:R - Tri et sous-définition des valeurs maximales dans les colonnes

*occ_code city1 ... city300* 
    occ1  5  ... 7 
    occ2  20  ... 22 
    .   .  .  . 
    .   .  .  . 
    occ800 20  ... 25 

pour chaque ville que je veux trier les valeurs maximales, sélectionnez un sous-ensemble de ces valeurs maximales par leurs professions appariées respectives titres et titres. Je pensais que ce serait relativement trivial mais ...

modifier pour la clarification: Je veux terminer par un sous-ensemble trié des données pour l'analyse.

 occ_code city1 
    occ200  10 
    occ90  8 
    occ20  2 
    occ95  1.5 

En même temps, je veux être en mesure de répéter la sage colonne de tri (donc j'ai essayé de beaucoup l'ordre des commandes en appelant colonnes directement: les données [2], juste pour être en mesure d'exécuter les mêmes fonctions d'analyse sur l'ensemble des données.

J'ai été déconner avec plyr pour les 3 derniers jours et je me sens comme la configuration de mon jeu de données est tout simplement pas propice à la façon dont plyer a été conçu pour être utilisé.

+1

Pouvez-vous clarifier un peu la question? Il serait utile de nous donner un exemple avec une trame de données plus petite en entrée et un exemple de la sortie que vous souhaitez extraire. – chrisamiller

+0

ouais, il est difficile de comprendre ce que vous voulez ici. – John

+0

Dans un premier temps, je veux obtenir un sous-ensemble avec deux colonnes de données: une liste des 10 plus grandes valeurs de la colonne "city1", correspondant à leur "occ_codes" respectifs, (à partir de la première colonne). Ce serait un tri assez simple dans dire Excel, seulement je devrais répéter l'opération 300 fois * 10 ans de données. – AzadA

Répondre

0

Je ne suis pas sûr de ce que votre sortie désirée est selon votre exemple snippit. Voici comment vous pouvez obtenir une trame de données comme pour toutes les villes en utilisant maintenant plyr et reshape

#using the same df from nico's answer 
library(reshape) 
df.m <- melt(df, id = 1) 
a.cities <- cast(df.m, codes ~ . | variable) 

library(plyr) 
a.cities.max <- aaply(a.cities, 1, function(x) arrange(x, desc(`(all)`))[1:4,]) 

, a.cities.max est un tableau de trames de données, avec les 4 plus grandes valeurs pour chaque ville, dans chaque trame de données. Pour obtenir une de ces trames de données, vous pouvez indexer avec

a.cities.max$X13 

Je ne sais pas exactement ce que vous allez faire avec ces données, mais vous pouvez revenir au format de trame de données.

df.cities.max <- adply(a.cities.max, 1) 
+0

Je pense que c'est ça! – AzadA

0

Une façon serait d'utiliser order avec ddply à partir du paquet plyr

> library(plyr) 
> d<-data.frame(occu=rep(letters[1:5],2),city=rep(c('A','B'),each=5),val=1:10) 
> ddply(d,.(city),function(x) x[order(x$val,decreasing=TRUE)[1:3],]) 

order pouvez trier sur plusieurs colonnes si vous le souhaitez.

0

Cela affichera le maximum pour chaque ville. Des résultats similaires peuvent être obtenus en utilisant sort ou order

# Generate some fake data 
codes <- paste("Code", 1:100, sep="") 
values <- matrix(0, ncol=20, nrow=100) 
for (i in 1:20) 
    values[,i] <- sample(0:100, 100, replace=T) 

df <- data.frame(codes, values) 

names(df) <- c("Code", paste("City", 1:20, sep="")) 

# Now for each city we get the maximum 
maxval <- apply(df[2:21], 2, which.max) 
# Output the max for each city 
print(cbind(paste("City", 1:20), codes[maxval])) 
Questions connexes