2012-03-16 40 views
13

entiendo cómo ordenar una trama de datos:Cómo ordenar y filtrar data.frame en R?

df[order(df$Height),]

y entiendo cómo filtrar (o subgrupo) una trama de datos coinciden con alguna predicado:

df[df$Weight > 120,]

pero ¿cómo puedo ordenar y filtro (como un ejemplo, ordenar por Altura y filtrar por Peso)?

Respuesta

14

bien en dos pasos

df1 <- df[df$weight > 120, ] 
df2 <- df1[order(df1$height), ] 

o si es necesario hacerlo en un solo paso - pero en realidad no es más limpio.

datos importantes primero:

R> set.seed(42) 
R> df <- data.frame(weight=rnorm(10, 120, 10), height=rnorm(10, 160, 20)) 
R> df 
    weight height 
1 133.7 186.1 
2 114.4 205.7 
3 123.6 132.2 
4 126.3 154.4 
5 124.0 157.3 
6 118.9 172.7 
7 135.1 154.3 
8 119.1 106.9 
9 140.2 111.2 
10 119.4 186.4 

Y una manera de hacerlo es doble de subconjuntos:

R> subset(df, weight > 120)[order(subset(df, weight > 120)$height),] 
    weight height 
9 140.2 111.2 
3 123.6 132.2 
7 135.1 154.3 
4 126.3 154.4 
5 124.0 157.3 
1 133.7 186.1 
R> 

me gustaría ir con los dos pasos.

+0

Solo por curiosidad, ¿por qué 'set.seed (42)'? – kohske

+0

Usaría 'reshape2 :: arrange (subconjunto (df, peso> 120), alto)' – baptiste

+0

Estaba esperando los Hadley-ismos apropiados :-) –

11

El paquete data.table que permite a esta en una corta línea de código:

Tomando prestado el ejemplo de Dirk Eddelbuettel, creó algunos datos:

set.seed(42) 
df <- data.frame(weight=rnorm(10, 120, 10), height=rnorm(10, 160, 20)) 

convertir el data.frame a un data.table y subconjunto de peso, pedido por la altura:

library(data.table) 
dt <- data.table(df) 

dt[weight>120][order(height)] 

     weight height 
[1,] 140.1842 111.1907 
[2,] 123.6313 132.2228 
[3,] 135.1152 154.3149 
[4,] 126.3286 154.4242 
[5,] 124.0427 157.3336 
[6,] 133.7096 186.0974 
+0

Agradable. Sí, esta es una de las funciones convenientes clave de 'data.table'. Me pregunto si los nuevos usuarios creen que tienen que convertir todo el tiempo para usar 'data.table'. En este caso, y muchos otros, la llamada a 'data.frame()' puede ser reemplazada por 'data.table()' y no es necesario convertir al comenzar con 'data.table' en primer lugar. Sé que lo sabes, es solo una cuestión de marketing realmente. –

2
df1 <- df[order(df$height), ][df$weight > 120, ] 

Solo asegúrate de poner la orden antes del filtro.

Cuestiones relacionadas