2017-06-09 9 views
1

Ich habe mehrere Spalten von Adressen, wo sie doppelte Informationen enthalten können (aber in der Regel nicht genau dupliziert Informationen haben).Suchen Spalte Wert in einer anderen Spalte enthalten R

Der folgende Code wird ein Beispiel für meine Ausgabe liefern,

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 

Dies ergibt folgendes Ergebnis,

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 

Die Schlussfolgerung, die ich brauche ist die folgende,

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 

Ich möchte herausfinden, ob add1 inenthalten ist. Wenn ich finde, dass add2 die gleichen Informationen enthält, die add1 liefert, dann möchte ich entweder die Kombination dieser bestimmten Spaltenwerte vermeiden oder die wiederholten Informationen in der kombinierten Spalte löschen (was meiner Meinung nach ein anderes Problem wiederholter Sätze in einem String lösen würde) . Ich war nicht in der Lage, ein Beispiel für das Auffinden von Spaltenwerten zu finden, die "enthalten" statt "exakt" sind - und ich arbeite mit über 500.000 Fällen in einem Datensatz, bei dem dieses Problem häufig auftritt. Jede Hilfe wird geschätzt.

Antwort

1

Wir split die zweite und die dritte Spalte durch einen oder mehr Zwischenraum (\\s+), dann paste die union der entsprechenden Reihen mit mapply dem ‚kombiniert‘

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" 

Oder einem anderen Möglichkeit ist, zu schaffen, gsub

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

Das ist perfekt, ich hatte nicht daran gedacht, mit eine Gewerkschaft - aber das war im Grunde, was ich suchte. Danke vielmals. – rastrast

1

Hier ist ein Weg, dies zu erreichen, wo die 01.238.prüft, ob add1 ist in add2, und wenn ja, dann ist es nicht enthalten, sonst ist es verbindet sie:

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))) 

Ausgang:

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 
Verwandte Themen