在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)
搜索每一个元素的
df$city1
在df2$city2
(部分或完全匹配)并返回这个元素的df2$city2
. 见?grep
以获取更多信息。替换
character(0)
(未找到要素),有NA
. 见 如何用R语言将列表中的字符(0)转换为NA? 以了解详情。将列表转换为一个向量(
unlist
).将结果附在城市列表中(
cbind
).
另一答案
您也可以尝试使用 fuzzyjoin
. 在这种情况下,你可以使用函数 stri_detect_fixed
从 stringi
包来识别字符串中至少一个固定模式的出现。
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中根据部分字符串的匹配度来查找值。的主要内容,如果未能解决你的问题,请参考以下文章