2011-08-01 25 views
6

Soy nuevo en R y quiero ordenar un marco de datos llamado "pesos". Aquí están los detalles:Cómo ordenar un marco de datos en R

>str(weights) 
'data.frame': 57 obs. of 1 variable: 
$ attr_importance: num 0.04963 0.09069 0.09819 0.00712 0.12543 ... 

> names(weights) 
    [1] "attr_importance" 

> dim(weights) 
    [1] 57 1 

> head(weights) 
     attr_importance 
make  0.049630556 
address  0.090686474 
all   0.098185517 
num3d  0.007122618 
our   0.125433292 
over  0.075182467 

que quiero para ordenar por orden de attr_importance disminuyendo pero quiero preservar los nombres de las filas correspondientes también.

me trataron:

> weights[order(-weights$attr_importance),] 

pero me da un "numérico" de nuevo.

Quiero un marco de datos atrás, que está ordenado por attr_importance y tiene los nombres de fila CORRESPONDING intactos. ¿Cómo puedo hacer esto?

Gracias de antemano.

+4

@ Jeff Atwood: No es que importe ahora, pero las preguntas no son duplicados en absoluto. Mi pregunta es más parecida a "cómo ordenar mientras se conservan los nombres de las filas", mientras que la que se refiere a "cómo ordenar por varias columnas". – user721975

+0

bien, reabrió entonces - disculpas –

Respuesta

8

Desde su hoja.de.datos sólo tiene una columna, es necesario establecer drop=FALSE para evitar que las dimensiones se caiga:

weights[order(-weights$attr_importance),,drop=FALSE] 
#   attr_importance 
# our   0.125433292 
# all   0.098185517 
# address  0.090686474 
# over  0.075182467 
# make  0.049630556 
# num3d  0.007122618 
+1

Lo tengo gracias. Mi cabeza está girando ahora. Hombre, R es muy difícil de aprender :-( – user721975

+1

drop = FALSE es la solución que olvidé :) – neilfws

+0

¡me salvaste! ¡Es interesante que la función sort() no conserve los nombres de las filas! – weber85

9

Aquí es la gran comparación sobre hoja.de.datos clasificación:

How to sort a dataframe by column(s)?

Usando mi solución preferida ahora arrange:

dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"), 
     levels = c("Low", "Med", "Hi"), ordered = TRUE), 
     x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9), 
     z = c(1, 1, 1, 2)) 
library(plyr) 
arrange(dd,desc(z),b) 
    b x y z 
1 Low C 9 2 
2 Med D 3 1 
3 Hi A 8 1 
4 Hi A 9 1 
+0

Buen truco. Gracias. – user721975

0

rankdata.txt

regno name   total maths science social cat 
1 SUKUMARAN 400 78 89 73 S 
2 SHYAMALA 432 65 79 87 S 
3 MANOJ  500 90 129 78 C 
4 MILYPAULOSE 383 59 88 65 G 
5 ANSAL  278 39 77 60 O 
6 HAZEENA  273 45 55 56 O 
7 MANJUSHA 374 50 99 52 C 
8 BILBU  408 81 97 72 S 
9 JOSEPHROBIN 374 57 85 68 G 
10 SHINY  381 70 79 70 S 
z <- data.frame(rankdata) 

z[with(z, order(-total+ maths)),] #order function maths group selection 
z 
z[with(z, order(name)),] # sort on name 
z 
Cuestiones relacionadas