【问题标题】:Pattern matching character vectors in RR中的模式匹配字符向量
【发布时间】:2021-05-15 09:37:11
【问题描述】:

我正在尝试匹配两个单独数据帧中两个向量之间的字符,我们将数据帧称为“rentals”和“parcels”,它们都包含向量“address”,它是所有出租包裹地址的字符县和城市中所有地块的地址。我们想通过搜索“parcels”中的地址向量与“rentals”中的地址匹配,找出“parcels”数据帧中的哪些地址与“rentals”数据帧中的地址匹配。

rentals$address 中的值如下所示:

rentals$address <- c("110 SW ARTHUR ST", "1610 NE 66TH AVE", "1420 SE 16TH AVE",...)

parcels$address 中的值如下所示:

parcels$address <- c("635 N MARINE DR, PORTLAND, OR, 97217", "7023 N BANK ST, PORTLAND, OR, 97203", "5410 N CECELIA ST, PORTLAND, OR, 97203",...)

“parcels”数据框中大约有 172,000 个条目,“rentals”数据框中有 285 个条目。我的第一个解决方案是使用 grepl 匹配字符值,我认为这不起作用:

matches = grepl(rentals$address, parcels$address, fixed = TRUE)

这将为 parcels$address 中的每个条目返回 FALSE,但是将“rentals”中的“address”的一些值复制并粘贴到 Excel 的 CNTRL+F 窗口中查看“parcels”数据框,我看到了一些地址。所以有些似乎匹配。

如何才能最好地找到“rentals”数据帧的“address”列中的哪个观察值是“parcels”数据帧中的匹配字符序列?

【问题讨论】:

  • 试试grepl(paste(rentals$address, collapse = '|'), parcels$address) 或者另一个选项是Reduce('|', lapply(rentals$address, function(pat) grepl(pat, parcels$address)))
  • 发布一组更大的示例地址并显示所需的答案。由于缺乏细节而投票结束,希望您能修改问题的主体以改进它,以便我可以撤销我的结束投票。
  • 看看fuzzyjoin 包。

标签: r dataframe


【解决方案1】:

地址是否都完全匹配?也就是说,间距、大小写、公寓编号没有变化?如果是这样,您也许可以使用 dplyr 函数 left_join 来创建一个新的 df,使用地址作为键,就像这样

    library(dplyr)

    df_compare <- df_rentals %>% 
      left_join(df_parcels, by = "address")

此外,如果您有沿 df_rentals$rentals = yes 和 df_parcels$parcels = yes 行的列,则可以过滤生成的新数据框

   df_both <- filter(df_compare, rentals == "yes", parcels == "yes")

【讨论】:

  • 投反对票推理:考虑到很少的例子,它很可能会失败。这确实是一个正则表达式匹配问题,所以请看...meta.stackoverflow.com/questions/285733/…(还有其他原因;我认为应该在评论中询问提问者是否应该在评论中询问创建具有真实示例的数据对象的代码(可能与非精确匹配) ,因为在这种情况下假设完全匹配似乎是不现实的。)
猜你喜欢
  • 2022-08-03
  • 1970-01-01
  • 2019-04-02
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
相关资源
最近更新 更多