web-dev-qa-db-fra.com

Filtrage d'une trame de données sur un vecteur

J'ai une trame de données df avec une colonne ID par exemple A, B, etc. J'ai également un vecteur contenant certains identifiants:

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

Comment puis-je filtrer la trame de données pour obtenir uniquement les identifiants présents dans le vecteur? Individuellement, j'utiliserais

subset(df, ID == "A")

mais comment filtrer sur un vecteur entier?

26
adam.888

Vous pouvez utiliser l'opérateur %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 vos identifiants sont uniques, vous pouvez utiliser 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

ou faites-en les noms de vos trames de données et extrayez-les par ligne:

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

Enfin, pour les utilisateurs plus avancés, et si la vitesse est un problème, je recommanderais de regarder dans le package data.table.

45
flodel

Je pense que vous devez utiliser "match". Il fait correspondre les valeurs d'un vecteur aux valeurs d'un autre vecteur et donne NA là où il n'y a pas de correspondance. Alors, vous sous-ensemble basé sur! Is.na du match.

Vous voyez? Match et vous pouvez probablement le faire vous-même, auquel cas vous en apprendrez plus que la réponse exacte que quelqu'un fera sous peu, ce qui vous encouragera simplement à couper et coller :)

2
Spacedman