2012-03-16 35 views
13

comprendo come ordinare un frame di dati:Come ordinare e filtrare data.frame in R?

df[order(df$Height),]

e capire come filtrare (o sottoinsieme) di un frame di dati corrispondente qualche predicato:

df[df$Weight > 120,]

ma come faccio ordinare il filtro e (ad esempio, ordine per Altezza e filtro per Peso)?

risposta

14

entrambi in due fasi

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

o se è necessario in un passo - ma non è in realtà qualsiasi detergente.

Dati prime:

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 

E un modo per farlo è doppio sottoinsiemi:

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> 

mi piacerebbe andare con il due fasi.

+0

Solo per curiosità, perché 'set.seed (42)'? – kohske

+0

Io userei 'reshape2 :: organizzare (sottoinsieme (df, peso> 120), altezza)' – baptiste

+0

Stavo aspettando gli appropriati Hadley-isms :-) –

11

Il pacchetto data.table permette a questo in una breve riga di codice:

Prendendo in prestito l'esempio di Dirk Eddelbuettel, istituito alcuni dati:

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

Convertire il data.frame ad un data.table e sottoinsieme su peso, ordinazione per l'altezza:

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

Bello. Sì, questa è una delle principali funzionalità di convenienza di 'data.table'. Mi chiedo se i nuovi utenti pensano di dover convertire tutto il tempo per usare 'data.table', però? In questo caso, e molti altri, la chiamata a 'data.frame()' può essere sostituita da 'data.table()' e non c'è bisogno di convertire quando si inizia con 'data.table' in primo luogo. So che lo sai, è solo una domanda di marketing. –

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

Assicurati di mettere l'ordine prima del filtro.

Problemi correlati