在R中根据部分字符串的匹配度来查找值。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在R中根据部分字符串的匹配度来查找值。相关的知识,希望对你有一定的参考价值。

我有一个表(表1),里面有很多城市(标点符号、大写和空格都被删除了)。

我想扫描第二张表(表2),并找出任何与字符串完全匹配或包含在其中任何地方的记录(第一张表)。

# Table 1
  city1    
1 waterloo 
2 kitchener
3 toronto  
4 guelph   
5 ottawa


# Table 2
  city2
1 waterlookitchener  
2 toronto  
3 hamilton  
4 cityofottawa  

这将得到下面看到的第三个表。

# Table 3
  city1      city2
1 waterloo   waterlookitchener  
2 kitchener  waterlookitchener  
3 toronto    toronto  
4 guelph     <N/A>  
5 ottawa     cityofottawa
答案

我相信有更复杂的方法来完成你的任务,但这里有一个简单的方法,使用的是 tidyverse.

df <- read_table2("city1
waterloo
kitchener
toronto
guelph
ottawa")

df2 <- read_table2("city2
waterlookitchener
toronto
hamilton
cityofottawa")

df3 <- df$city1 %>% 
  lapply(grep, df2$city2, value=TRUE) %>%
  lapply(function(x) if(identical(x, character(0))) NA_character_ else x) %>%
  unlist

df3 <- cbind(df, df3)
  1. 搜索每一个元素的 df$city1df2$city2 (部分或完全匹配)并返回这个元素的 df2$city2. 见 ?grep 以获取更多信息。

  2. 替换 character(0) (未找到要素),有 NA. 见 如何用R语言将列表中的字符(0)转换为NA? 以了解详情。

  3. 将列表转换为一个向量(unlist).

  4. 将结果附在城市列表中(cbind).

另一答案

您也可以尝试使用 fuzzyjoin. 在这种情况下,你可以使用函数 stri_detect_fixedstringi 包来识别字符串中至少一个固定模式的出现。

library(fuzzyjoin)
library(stringi)
library(dplyr)

fuzzy_right_join(table2, table1, by = c("city2" = "city1"), match_fun = stri_detect_fixed) %>% 
  select(city1, city2)

輸出

      city1             city2
1  waterloo waterlookitchener
2 kitchener waterlookitchener
3   toronto           toronto
4    guelph              <NA>
5    ottawa      cityofottawa

数据

table1 <- structure(list(city1 = c("waterloo", "kitchener", "toronto", 
"guelph", "ottawa")), class = "data.frame", row.names = c(NA, 
-5L))

table2 <- structure(list(city2 = c("waterlookitchener", "toronto", "hamilton", 
"cityofottawa")), class = "data.frame", row.names = c(NA, -4L
))

以上是关于在R中根据部分字符串的匹配度来查找值。的主要内容,如果未能解决你的问题,请参考以下文章

子集不是基于精确匹配,而是 R 中的部分

数据结构开发(14):KMP 子串查找算法

根据列表中项目内的部分字符串查找列表中的所有索引位置

如何在嵌套循环中匹配来自两个字符串向量的字符串值

根据查找值将值从一张表匹配并粘贴到另一张表中

Linux搜索所有文件中的内容