【问题标题】:Join based on substring基于子字符串连接
【发布时间】:2018-12-08 18:23:00
【问题描述】:

我有一个包含以下电子邮件的数据集:

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. 如何使用 open_data 查找 my_df 以将性别与每封电子邮件相关联?
  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))

【问题讨论】:

  • 知道怎么加入elsapina,有男有女子组件的逻辑是什么?
  • 我只需要一个快速的解决方案,而不是 100% 准确。
  • 快速并不意味着易于编码。我什至无法为此表达 SQL 查询,更不用说 R 代码了。
  • 我简化了问题。我只需要它根据 emaii 是否完全包含 open_data$name 来执行连接

标签: r regex join


【解决方案1】:

也许是这样的?不过,不确定这对于更复杂的情况会有多强大。

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

解释:我们使用grepmy_df$email 中查找open_data$name 的匹配项;然后unnest 扩展多个匹配项,并使用行索引提取email 条目。

【讨论】:

    【解决方案2】:

    一种选择是使用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)
    

    【讨论】:

    • 聪明的想法,因此我验证你的答案。最后,我使用了另一个解决方案(根据stackoverflow.com/questions/32914357/…的第一个答案略有改编),我将在接下来的几天分享。
    猜你喜欢
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    相关资源
    最近更新 更多