2012-02-19 15 views
18

Ho un frame dati df con una colonna ID, ad esempio A, B, ecc. Ho anche un vettore contenente alcuni ID:Filtraggio di un frame di dati su un vettore

L <- c("A", "B", "E") 

Come posso filtrare il frame di dati per ottenere solo l'ID presente nel vettore? Singolarmente, vorrei usare

subset(df, ID == "A") 

ma come faccio a filtrare su un intero vettore?

risposta

35

È può utilizzare il %in% dell'operatore:

> df <- data.frame(id=c(LETTERS, LETTERS), x=1:52) 
> L <- c("A","B","E") 
> subset(df, id %in% L) 
    id x 
1 A 1 
2 B 2 
5 E 5 
27 A 27 
28 B 28 
31 E 31 

Se gli ID sono unici, è possibile utilizzare match():

> df <- data.frame(id=c(LETTERS), x=1:26) 
> df[match(L, df$id), ] 
    id x 
1 A 1 
2 B 2 
5 E 5 

o fare loro la rownames del vostro dataframe e l'estratto di fila:

> rownames(df) <- df$id 
> df[L, ] 
    id x 
A A 1 
B B 2 
E E 5 

Infine, per gli utenti più avanzati, e se la velocità è una preoccupazione, io consiglierei di guardare nel pacchetto data.table.

+1

Per completezza: puoi anche usare 'df [id% in% L,]' – JaKu

1

Suppongo che sia necessario utilizzare 'match'. Abbina i valori di un vettore ai valori di un altro vettore e fornisce NA dove non c'è corrispondenza. Quindi, il sottoinsieme si basa su! Is.na della partita.

Vedete? Partita e probabilmente si può lavorare fuori per lei, nel qual caso si imparare più che dalla risposta esatta che qualcuno lo farà a breve che sarà solo vi incoraggio a tagliare n incollare :)

Problemi correlati