r

Mappage des lignes de deux cadres de données basés sur plusieurs conditions

Par exemple, si j'ai deux cadres de données df1 et df2, qui ont les deux 3 Colonne avec noms de colonne c /"Name", "Region", "State"/ Et ressemble à ceci:

df1:


Name Region State
A Boston City Mass
B Washington D.C. NA
C New York NY


df2:


Name Region Job
C Boston Massachusetts
B D.C. NA
A Boston Massachusetts
D Dallas Texas


Ce que je veux faire - il voit s'il y a une ligne dans df1 La chaîne correspondante B. df2, exactement coïncidant S. "name", Mais seulement partiellement coïncidant avec "Region" et "Job". Par exemple, "Boston City" et "Boston" devrait être considéré comme le même /La même chose pour "Washington D.C" et "32"/, et "Mass" et "Massachusetts" Également devrait être considéré comme le même. Ainsi, les chaînes avec des noms "A" et "B" dans df1 doit coïncider avec succès avec les lignes correspondantes avec les noms "A" et "B" dans df2. Ce que je veux pour le résultat - Ceci est un cadre de données avec deux colonnes. Colonne 1 - Ce sont des indices de ligne df1, qui ont une coïncidence dans df2, et la colonne 2 est les indices des rangées des chaînes correspondantes correspondantes dans df2. C'est à dire,


Column1 Column2
1 3
2 2


Je sais que je peux probablement utiliser grep Pour une comparaison partielle? Mais je ne sais toujours pas comment atteindre mon objectif. Remercier!
Invité:

Christine

Confirmation de:

Nous pouvons créer une index de lignes pour chaque cadre de données, puis
full_join

Basé sur la colonne
Name

. Ensuite, nous choisissons seulement ces lignes où
Region

Coïncide partiellement, et
Job

et
State

Coïncident partiellement. Nous sélectionnons également des chaînes lorsque les deux colonnes sont valides
NA

.


library/dplyr/
library/stringr/

df1 %>%
mutate/Column1=row_number/// %>%
full_join/df2 %>% mutate/Column2 = row_number///, by = 'Name'/ %>%
filter//str_detect/Region.x, fixed/Region.y// |
/is.na/Region.x/ & is.na/Region.y/// &
/str_detect/Job, fixed/State// | /is.na/Job/ & is.na/State//// %>%
select/Column1, Column2/

# Column1 Column2
#1 1 3
#2 2 2


Les données


df1 <- structure/list/Name = c/"A", "B", "C"/, Region = c/"BostonCity", 
"WashingtonD.C.", "NewYork"/, State = c/"Mass", NA, "NY"//, row.names = c/NA,
-3L/, class = "data.frame"/

df2 <- structure/list/Name = c/"C", "B", "A", "D"/, Region = c/"Boston",
"D.C.", "Boston", "Dallas"/, Job = c/"Massachusetts", NA, "Massachusetts",
"Texas"//, row.names = c/NA, -4L/, class = "data.frame"/

Pour répondre aux questions, connectez-vous ou registre