2012-02-19 8 views
18

Mam ramkę danych df z kolumną identyfikatora, np. A, B itd. Mam również wektor zawierający pewne identyfikatory:Filtrowanie ramki danych na wektorze

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

Jak mogę filtrować ramkę danych, aby uzyskać tylko identyfikatory obecne w wektorze? Indywidualnie użyłbym

, ale jak mogę filtrować na całym wektorze?

Odpowiedz

35

Ty można użyć operatora %in%:

> 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 

Jeśli identyfikatory są unikalne, można użyć 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 

lub uczynić z nich rownames Twojego dataframe i ekstraktu z rzędu:

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

Wreszcie, dla bardziej zaawansowanych użytkowników, a jeśli prędkość jest problemem, ja polecam patrząc na opakowaniu data.table.

+1

Dla kompletności: Możesz także użyć 'df [id% w% L,]' – JaKu

1

Uważam, że musisz użyć "dopasowania". Dopasowuje wartości w jednym wektorze do wartości w innym wektorze i daje NA, gdzie nie ma zgodności. Więc podzbiór bazuje na! Is.na z meczu.

See mecz i prawdopodobnie można pracować go dla siebie, w którym to przypadku dowiesz się więcej niż od dokładnej odpowiedzi ktoś zrobi wkrótce który będzie po prostu zachęcamy do cięcia n wklej :)