2017-06-09 2 views
1

J'ai plusieurs colonnes d'adresses, où elles peuvent contenir des informations dupliquées (mais elles ne contiennent généralement pas d'informations dupliquées).Recherche de la valeur de colonne contenue dans une autre colonne R

Le code suivant fournit un exemple de ma question,

id= c(1, 2) 
add1 = c("21ST AVE", "5TH ST") 
add2 = c("21ST AVE BLAH ST", "EAST BLAH BLVD") 
df = data.frame(id, add1, add2) 
df$combined = paste(add1, add2) 
df 

Cela donne le résultat suivant,

id  add1    add2     combined 
1 1 21ST AVE 21ST AVE BLAH ST 21ST AVE 21ST AVE BLAH ST 
2 2 5TH ST EAST BLAH BLVD  5TH ST EAST BLAH BLVD 

La conclusion que je dois est le suivant,

id  add1    add2     combined 
1 1 21ST AVE 21ST AVE BLAH ST   21ST AVE BLAH ST 
2 2 5TH ST EAST BLAH BLVD  5TH ST EAST BLAH BLVD 

Je souhaite savoir si le add1 est contenu dans add2. Si je trouve que add2 contient les mêmes informations que add1 fournit, alors je veux soit éviter de combiner ces valeurs de colonne particulières ou supprimer les informations répétées dans la colonne combinée (qui je crois nécessiterait de résoudre un problème différent de phrases répétées dans une chaîne) . Je n'ai pas réussi à trouver un exemple de recherche de valeurs de colonne qui soient «contenues dans» plutôt que «exactes» - et je travaille avec plus de 500 000 cas dans un ensemble de données où ce problème est courant. Toute aide est appréciée.

Répondre

1

Nous split la deuxième et la troisième colonne par un ou plusieurs espace (\\s+), puis paste la union des rangées correspondantes avec mapply pour créer le « combiné »

lst <- lapply(df[2:3], function(x) strsplit(as.character(x), "\\s+")) 
df$combined <- mapply(function(x,y) paste(union(x, y), collapse=" "), lst$add1, lst$add2) 
df$combined 
#[1] "21ST AVE BLAH ST"  "5TH ST EAST BLAH BLVD" 

ou une autre option est gsub

gsub("((\\w+\\s*){2,})\\1", "\\1", do.call(paste, df[2:3])) 
#[1] "21ST AVE BLAH ST"  "5TH ST EAST BLAH BLVD" 
+1

C'est parfait, je ne l'avais pas pensé à utiliser un syndicat - mais c'est essentiellement ce que je cherchais. Merci beaucoup. – rastrast

1

est ici une façon d'y arriver où le ifelse teste si add1 est en add2, et si oui, alors ne comprend pas, sinon il les combine:

id= c(1, 2) 
add1 = c("21ST AVE", "5TH ST") 
add2 = c("21ST AVE BLAH ST", "EAST BLAH BLVD") 
df = data.frame(id, add1, add2, stringsAsFactors = F) 

require(stringr) 
require(dplyr) 

df %>% mutate(combined = ifelse(str_detect(add2, add1), 
           add2, 
           str_c(add1, add2))) 

Sortie:

id  add1    add2    combined 
1 1 21ST AVE 21ST AVE BLAH ST  21ST AVE BLAH ST 
2 2 5TH ST EAST BLAH BLVD 5TH STEAST BLAH BLVD