2017-10-03 4 views
3

J'essaie de substituer plusieurs motifs dans un vecteur de caractères avec leurs chaînes de remplacement correspondantes. Après avoir fait des recherches, j'ai trouvé le paquetage gsubfn qui, je pense, est capable de faire ce que je veux, mais quand je lance le code ci-dessous, je ne reçois pas mon résultat attendu (voir fin de la question).).La fonction gsubfn ne donne pas la sortie désirée quand ignore.case = TRUE

library(gsubfn) 

# Our test data that we want to search through (while ignoring case) 

test.data<- c("1700 Happy Pl","155 Sad BLVD","82 Lolly ln", "4132 Avent aVe") 

#  A list data frame which contains the patterns we want to search for 
#  (again ignoring case) and the associated replacement strings we want to 
#  exchange any matches we come across with. 


frame<- data.frame(pattern= c(" Pl"," blvd"," LN"," ave"), replace= c(" Place", " Boulevard", " Lane", " Avenue"),stringsAsFactors = F) 

# NOTE: I added spaces in front of each of our replacement terms to make 
#  sure we only grab matches that are their own word (for instance if an 
#  address was 45 Splash Way we would not want to replace "pl" inside of 
#  "Splash" with "Place 

#  The following set of paste lines are supposed to eliminate the substitute function from 
#  grabbing instances like first instance of " Ave" found directly after "4132" 
#  inside "4132 Avent Ave" which we don't want converted to " Avenue". 

pat <- paste(paste(frame$pattern,collapse = "($|[^a-zA-Z])|"),"($|[^a-zA-Z])", sep = "") 

#  Here is the gsubfn function I am calling 
gsubfn(x = test.data, pattern = pat, replacement = setNames(as.list(frame$replace),frame$pattern), ignore.case = T) 

sortie reçu:

[1] "1700 Happy" "155 Sad" "82 Lolly" "4132 Avent" 

Résultats escomptés:

[1] "1700 Happy Place" "155 Sad Boulevard" "82 Lolly Lane" "4132 Avent Avenue" 

Ma théorie de travail sur la raison pour laquelle cela ne fonctionne pas est que les matchs ne correspondent pas aux noms associés la liste que je passe dans l'argument de remplacement de gsubfn en raison de quelques différences de cas (par exemple: le match trouvé sur "155 Sad BLVD" n'est pas == "blvd" même s'il a pu être vu comme un match en raison de l'argument ignore.case). Est-ce que quelqu'un peut confirmer que c'est le problème/me signaler ce qui pourrait mal se passer, et peut-être une façon de corriger cela qui ne nécessite pas d'étendre mon modèle vectoriel pour inclure toutes les permutations de cas si possible?

Répondre

0

On dirait stringr a une solution simple pour vous:

library(stringr) 

str_replace_all(test.data, 
       regex(paste0('\\b',frame$pattern,'$'),ignore_case = T), 
       frame$replace) 
#[1] "1700 Happy Place" "155 Sad Boulevard" "82 Lolly Lane"  "4132 Avent Avenue" 

Notez que je devais modifier l'expression régulière à rechercher que des mots à la fin de la chaîne en raison de la délicate « AVENT avé ». Mais bien sûr, il y a d'autres façons de gérer cela aussi.