Слияние фреймов данных с частичным сопоставлением с использованием R - PullRequest
0 голосов
/ 09 февраля 2020

Допустим, у меня есть фрейм данных df1 со следующими переменными

Continent   Country
1   Europe  Russia
2   Asia    Myanmar (Burma)
3   africa  Benin
4   africa  Botswana
5   africa  Burkina

и df2 со следующими переменными

Continent   Country
1   Europe  Russian Federation
2   Asia    Myanmar
3   africa  Benin,new
4   africa  Botswana
5   africa  Burkina

Как объединить 2 df по стране, используя частичное соответствие

Ответы [ 2 ]

2 голосов
/ 09 февраля 2020

Вы можете объединить первые пять символов. Вам нужно будет установить stringr пакет

, реплицирующий ваши данные

a<- data.frame( Continent=c("Europe","Asia","africa","africa","africa"), Country=c("Russia","Myanmar (Burma)","Benin","Botswana","Burkina"))
b <- data.frame( Continent=c("Europe","Asia","africa","africa","africa"), Country=c("Russian Federation","Myanmar","Benin,new","Botswana","Burkina"))

создать переменную, состоящую из первых пяти букв нижнего регистра

 a$key <- stringr::str_extract(tolower(a$Country), "\\b[a-z]{0,5}")
 b$key <- stringr::str_extract(tolower(b$Country), "\\b[a-z]{0,5}")

, а затем объединить на новый ключ (вы, вероятно, захотите переименовать ваши столбцы до этого слияния

  merge( a , b , by="key")
0 голосов
/ 10 февраля 2020

Может быть полезно знать, как будет выглядеть ваш конечный / желаемый фрейм данных.

Вы можете рассмотреть пакет fuzzyjoin при объединении этих двух фреймов данных. Один из подходов состоит в том, чтобы использовать str_detect и посмотреть, содержится ли одна строка Country в другой.

library(tidyverse)
library(fuzzyjoin)

mf <- function(a, b) str_detect(a, b) | str_detect(b, a)

fuzzy_semi_join(df1, df2, by = "Country", match_fun = mf)

  Continent         Country
1    Europe          Russia
2      Asia Myanmar (Burma)
3    Africa           Benin
4    Africa        Botswana
5    Africa         Burkina

Внутреннее объединение будет определять соответствие строк (сохраняя оба столбца Country). для сравнения):

fuzzy_inner_join(df1, df2, by = "Country", match_fun = mf)

  Continent.x       Country.x Continent.y          Country.y
1      Europe          Russia      Europe Russian Federation
2        Asia Myanmar (Burma)        Asia            Myanmar
3      Africa           Benin      Africa          Benin,new
4      Africa        Botswana      Africa           Botswana
5      Africa         Burkina      Africa            Burkina
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...