2
votes

Recherche d'un motif dans R

J'essaye de nettoyer certaines données. Voici un exemple de mes données.

   test1          test2         test3     col
 jsb cjn       kd N069W j        N9DSW      2

Je veux indiquer quelle colonne contient le modèle N0 {num} {num} W. La partie {num} peut être n'importe quel nombre compris entre 0 et 9. Ce modèle peut également apparaître n'importe où dans la chaîne. Par conséquent, dans ce cas, mes résultats seraient les suivants.

   test1          test2         test3    
 jsb cjn       kd N069W j        N9DSW 

Merci d'avance pour toute aide.


0 commentaires

3 Réponses :


3
votes

Nous parcourons les colonnes, utilisons grepl pour obtenir un index logique puis avec max.col obtenons l'index de colonne de chaque ligne

df1 <- structure(list(test1 = "jsb cjn", test2 = "kd N069W j", 
 test3 = "N9DSW"), class = "data.frame", row.names = c(NA, 
 -1L))


1 commentaires

Si le modèle semble avoir 2 chiffres, l'expression régulière ne devrait-elle pas être "NO \\ d \\ dW" ?



2
votes

vous pouvez également utiliser la fonction str_detect () de la bibliothèque stringr^.

library(stringr)
str_detect('kd NO69W j', pattern = "NO\\d+W")
# [1] TRUE


2 commentaires

Je suppose que d + w recherche les chiffres, par curiosité, comment rechercheriez-vous des lettres entre a-z? @demarsylvain


Vous pouvez rechercher une "expression régulière". L'argument pattern = acceptera la plupart d'entre eux ( rdocumentation.org/packages/stringr/versions/1.3.1/topics/... ‌). Par exemple, str_detect (character_value, pattern = "[a-zA-Z]")



2
votes

Utilisation de apply:

df <- structure(list(test1 = structure(1L, .Label = "jsb cjn", class = "factor"), 
    test2 = structure(1L, .Label = "kd N069W j", class = "factor"), 
    test3 = structure(1L, .Label = "N9DSW ", class = "factor")), class = "data.frame", row.names = c(NA, 
-1L))

Data:^

df$col <- apply(df, 1, function(x) grep("N0\\d{2}W", x))


0 commentaires