2012-02-19 9 views
18

Tengo un marco de datos df con una columna de ID, por ejemplo, A, B, etc. También he un vector que contiene determinados ID:Filtrar un marco de datos en un vector

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

Como puedo filtrar la trama de datos para obtener sólo los ID presente en el vector? Individualmente, usaría

subset(df, ID == "A") 

pero ¿cómo puedo filtrar en un vector completo?

Respuesta

35

Usted se puede utilizar el operador de %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 

Si los identificadores son únicos, puede utilizar 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 

como si los hace el rownames de su trama de datos y el extracto de fila:

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

Por último, para los usuarios más avanzados, y si la velocidad es una preocupación, me gustaría recomendar buscando en el paquete data.table.

+1

Por completness: también puede usar 'df [id% en% L,]' – JaKu

1

Supongo que debe usar 'coincidencia'. Concuerda los valores de un vector con los valores de otro vector, y da NA donde no hay coincidencia. Entonces, usted subconjunto basado en! Is.na del partido.

ve? Cerilla y es probable que pueda trabajar por ti mismo, en cuyo caso podrás aprender más que de la respuesta exacta que alguien va a hacer en breve, que sólo le animará a cortar pegar n :)

Cuestiones relacionadas