2017-12-08 1 views
-2

Ich muss zwei Datenrahmen übereinstimmen, aber dort ID ist nicht genau das Gleiche. ID2 ist vielleicht länger, enthält aber alle Zeichen in ID1. Wie gehe ich links in zwei Tabellen, ohne Informationen zu verlieren. zum Beispiel und 485 gelten als gleich.Match (Join) zwei Datenrahmen mit regulären Ausdruck in r

library(tidyverse) 
data1 <- tibble(id = c(175642619,172881781,182219556,41925997,201404118), 
      case_id=c(2746306,2746823,2749855,2749933,2750222)) 

data2 <- tibble(id = c(175642619,172881781568,485182219556,41925997,201404118), 
      case_id2=c(2746306,2746823,2749855,2749933,2750222)) 

left_join(data1, data2) 

Antwort

0

Sie können diese mit fuzzyjoin Bibliothek tun. Es gibt stringdist_left_join, die eine linke Verknüpfung basierend auf einem Abstand zwischen zwei Zeichenfolgen ist. In Ihrem Fall setze ich max_dist gleich 3. Das bedeutet, dass zwei Strings als gleich angesehen werden, was eine maximale Entfernung von bis zu 3 Zeichen zwischen zwei Strings erlaubt, was in Ihrem Fall der Fall ist.

library(fuzzyjoin) 
stringdist_left_join(data1, data2, by ="id", max_dist = 3) 

#  id.x case_id   id.y case_id2 
#1 175642619 2746306 175642619 2746306 
#2 172881781 2746823 172881781568 2746823 
#3 182219556 2749855 485182219556 2749855 
#4 41925997 2749933  41925997 2749933 
#5 201404118 2750222 201404118 2750222 
+0

was ist, wenn die Länge von id2 zweimal von id1 ist? –

+0

In diesem Fall erhöhen Sie die 'max_dist'. In Ihrem Fall ist es der Unterschied zwischen den beiden Strings. Nehmen wir an, die Länge von ID1 ist 5 und die Länge von ID2 ist 8. Also wäre 'max_dist' für dieses Beispiel 5. – Santosh

+0

Ich meine die Länge von ID2 ist 10 in meinem Kommentar. – Santosh

Verwandte Themen