【问题标题】:How to assign value based on string match in R如何根据R中的字符串匹配分配值
【发布时间】:2025-12-12 23:50:02
【问题描述】:

我有两个数据框:

DF_1

ID      Value1
1       Lion
2       Cat
3       Elephant
4       Lion -s

DF_2

Value2          Assign
Lion - X        AD
Cat as          FD
Elephant -92    DS
Viper           AB
Fish ws r       DF

我想将 DF_1 的 Value1 与 DF_2 的 Value2 匹配,对于 DF_2 中 DF_1 的任何相似值,在新的输出数据帧中分配 DF_2 的 Assign 列(使用基于 Value1 的合并) .

上述数据框仅用于示例,我有非常大的数据框,Value1 不同,但Value1Value2 两个数据框的值会有相似之处。

所需输出:

ID      Value1     Assign
1       Lion       AD
2       Cat        FD
3       Elephant   DS
4       Lion -s    AD

【问题讨论】:

  • “相似”是什么意思?直到第一个空格?
  • @JasonAizkalns 是的,但它可以是任何东西,即第一个“-”或任何其他符号。
  • @JasonAizkalns 如果有Lion<4?2lion sLion-xe,那么所有的都应该赋值AD

标签: r dataframe dplyr tidyr


【解决方案1】:

一种方法是通过正则表达式提取第一个“单词”,然后匹配该提取的小写版本:

library(tidyverse)

DF_1 <- data_frame(
  ID = 1:7,
  Value1 = c('Lion', 'Cat', 'Elephant', 'Lion -s', 'Lion<4?2', 'lion s', 'Lion-xe')
)

DF_2 <- data_frame(
  Value2 = c('Lion - X', 'Cat as', 'Elephant -92', 'Viper', 'Fish ws r'),
  Assign = c('AD', 'FD', 'DS', 'AB', 'DF')
)

DF_1$first_word <- str_extract(DF_1$Value1, "\\w+") %>% str_to_lower()
DF_2$first_word <- str_extract(DF_2$Value2, "\\w+") %>% str_to_lower()

DF_1 %>%
  left_join(DF_2, by = "first_word")
#> # A tibble: 7 x 5
#>      ID Value1   first_word Value2       Assign
#>   <int> <chr>    <chr>      <chr>        <chr> 
#> 1     1 Lion     lion       Lion - X     AD    
#> 2     2 Cat      cat        Cat as       FD    
#> 3     3 Elephant elephant   Elephant -92 DS    
#> 4     4 Lion -s  lion       Lion - X     AD    
#> 5     5 Lion<4?2 lion       Lion - X     AD    
#> 6     6 lion s   lion       Lion - X     AD    
#> 7     7 Lion-xe  lion       Lion - X     AD

【讨论】:

  • 离开时没有得到Assign 列。
  • 在某些情况下,第一个单词方法不起作用(即 Where Lion - Cat Assign DV 和 Lion - xe Assign AD
  • 你能帮帮我吗?
  • 一些事情,我不确定你为什么没有收到Assign 列,我上面的代码是可重现的。当您说“您有一些案例……”时,这意味着您的问题和阐明的案例不完整。例如,您提供的DF_2 data.frame 中没有DV 值。此时,您可能希望从这个问题中吸取任何教训,并大量编辑您的原始问题或发布一个新问题。
  • 我已经运行了您的可重现代码,输出显示在控制台中,但未存储在 DF_1 中