web-dev-qa-db-fra.com

Comment sélectionner les lignes R data.table en fonction de la correspondance de la sous-chaîne (comme la SQL)

J'ai un data.table avec une colonne de caractères et je souhaite sélectionner uniquement les lignes qui contiennent une sous-chaîne. Équivalent à SQL WHERE x LIKE '%substring%'

Par exemple.

> Months = data.table(Name = month.name, Number = 1:12)
> Months["mb" %in% Name]
Empty data.table (0 rows) of 2 cols: Name,Number

Comment sélectionner uniquement les lignes où Nom contient "mb"?

47
Corone

data.table A une fonction like.

Months[like(Name,"mb")]
        Name Number
1: September      9
2:  November     11
3:  December     12

Ou, %like% Est plus joli:

> Months[Name %like% "mb"]
    Name Number
1: September      9
2:  November     11
3:  December     12

Notez que %like% Et like() utilisent grepl (renvoie un vecteur logique) plutôt que grep (renvoie des emplacements entiers). C'est ainsi qu'il peut être combiné avec d'autres conditions logiques:

> Months[Number<12 & Name %like% "mb"]
        Name Number
1: September      9
2:  November     11

et vous bénéficiez également de la puissance de la recherche d'expressions régulières (pas seulement des caractères génériques% ou *).

81
Matt Dowle

L'opérateur %in% Ne fait pas de correspondance de chaîne partielle, il est utilisé pour rechercher si des valeurs existent dans un autre ensemble de valeurs, c'est-à-dire "a" %in% c("a","b","c")

Pour effectuer une correspondance partielle de chaînes, vous devez utiliser la fonction grep(). Vous pouvez utiliser le grep pour renvoyer un index de toutes les colonnes contenant "mb". Sous-ensemble ensuite les lignes par cet index

Months[grep("mb", Name)]    # data.table syntax slightly easier
9
LostLin