我可以通过公共列的部分字符串匹配来合并两个数据框吗?

问题描述 投票:0回答:1

我有两个数据框,我希望根据“物种”列合并为一个数据框

数据框1:

物种
澳洲主题
燕麦主题
四肢主题
主题三安德拉
芥菜
长叶洛曼德拉

数据框2:

物种 通用名称
Themeda australis (R.Br.) Stapf 袋鼠草
Themeda avenacea (F.Muell.) Lugger 原生燕麦
Themeda fourrivalvis (L.) Kuntze。 平地机草
Themeda triandra Forssk。 袋鼠草
Lomandra juncea (F.Muell.) Ewart 沙漠垫子冲刺
Lomandra longifolia Labill。 刺头垫草

但是,因为有多个物种包含相同的字符串,所以我想仅通过物种列的前两个单词来匹配数据框(例如 Themeda triandra == Themeda triandra Forssk。)。请记住,我正在处理大数据:Dataframe 1 为 32,931 行,Dataframe 2 为 16,185 行。没有匹配项可以表示为 NA。

所需输出:

物种 通用名称
澳洲主题 袋鼠草
燕麦主题 原生燕麦
四肢主题 平地机草
主题三安德拉 袋鼠草
芥菜 沙漠垫子冲刺
长叶洛曼德拉 刺头垫草

这可能吗?

我尝试过以下方法:

output <- df1 %>%
  fuzzy_inner_join(df2, by = "Species", match_fun = str_detect)
r string dplyr merge fuzzy-search
1个回答
0
投票

你可以试试这个:

library(tidyverse)
data.frame(Species = c(
  "Themeda australis (R.Br.) Stapf",
  "Themeda avenacea (F.Muell.) Lugger",
  "Themeda quadrivalvis (L.) Kuntze.",
  "Themeda triandra Forssk. ",
  "Lomandra juncea (F.Muell.) Ewart",
  "Lomandra longifolia Labill."),
  Common_name = c(
    "Kangaroo grass",
    "Native oat",
    "Grader grass",
    "Kangaroo grass",
    "Desert Mat-rush",
    "Spiny-headed Mat-rush"
  )
) %>% 
  mutate(Species = str_extract(Species, "^([\\w\\-]+) ([\\w\\-]+)"))

结果:

               Species           Common_name
1    Themeda australis        Kangaroo grass
2     Themeda avenacea            Native oat
3 Themeda quadrivalvis          Grader grass
4     Themeda triandra        Kangaroo grass
5      Lomandra juncea       Desert Mat-rush
6  Lomandra longifolia Spiny-headed Mat-rush

其实好像没有必要加入。我们可以从

Species
列中提取前两个单词。无论如何,您可以(简单,而不是模糊)将此结果 data.frame 与具有两个单词 Species 列的任何其他 data.frame 连接。

© www.soinside.com 2019 - 2024. All rights reserved.