Присоединиться на основе подстроки - PullRequest
0 голосов
/ 29 июня 2018

У меня есть набор данных с электронными письмами, такими как:

my_df <- data.frame(email = c("mirko@asdoi.com", "elsa@asodida.co.uk", "elsapina@asoqw.com"))

И у меня есть набор данных с открытым исходным кодом, как:

open_data <- data.frame(name = c("mirko", "elsa", "pina"), gender = c("male", "female", "male")
  1. Как я могу выполнить поиск my_df с помощью open_data, чтобы связать пол с каждым письмом?
  2. В случае множественного объединения я хочу создать несколько записей

Результат должен быть:

result <- data.frame(email = c("mirko@asdoi.com", "elsa@asodida.co.uk", "elsapina@asoqw.com", "elsapina@asoqw.com"), gender = c("male", "female", "female", "male))

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Один из вариантов - использовать библиотеку sqldf и решить эту проблему с помощью соединения в стиле базы данных между двумя фреймами данных:

library(sqldf)
my_df$name <- sub("@.*$", "", my_df$email)
sql <- "select t1.email, t2.gender from my_df t1 inner join open_data t2 "
sql <- paste0(sql, "on t1.name like '%' || t2.name || '%'")
result <- sqldf(sql)
0 голосов
/ 29 июня 2018

Возможно, что-то в этом роде? Не уверен, насколько надежным это будет для более сложных случаев.

library(tidyverse)
open_data %>%
    rowwise() %>%
    mutate(email = list(grep(name, my_df$email))) %>%
    unnest() %>%
    mutate(email = my_df$email[email])
## A tibble: 4 x 3
#  name  gender email
#  <fct> <fct>  <fct>
#1 mirko male   mirko@asdoi.com
#2 elsa  female elsa@asodida.co.uk
#3 elsa  female elsapina@asoqw.com
#4 pina  male   elsapina@asoqw.com

Объяснение: Мы используем grep, чтобы найти совпадения open_data$name в my_df$email; затем unnest для расширения нескольких совпадений и использования индексов строк для извлечения email записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...