【问题标题】:match two vectors by similar characters/strings in R通过 R 中的相似字符/字符串匹配两个向量
【发布时间】:2021-08-20 23:32:03
【问题描述】:

我有两个向量,比如

v1<-c("yellow", "red", "orange", "blue", "green")
v2<-c("blues", "redx", "grean")

我想匹配它们,即将v1 的每个元素与v2 上最相似的元素“链接”,这样结果就是

> df
      v1    v2
1 yellow  <NA>
2    red  redx
3 orange  <NA>
4   blue blues
5  green grean

下面的代码给出了预期的结果,但这只是因为它已经手动“格式化”了

df<-data.frame(v1,v2=rep(NA,5))

for (i in 1:nrow(df)) {
  
  ag<-agrep(df[i,1], v2, ignore.case = T, value = T)
  
  if (length(ag)==0) {df[i,2]<-NA}
  else if (length(ag)==1) {df[i,2]<-ag}
  else {df[i,2]<-ag[1]}
  
}

即使我设置了max.distance = 0.00001agrep(df[2,1], v2, max.distance = 0.00001, ignore.case = T, value = T) 的结果也是 "redx" "grean"

这就是为什么我有 if 条件,但它不能保证选择最相似的答案。

我该如何解决这个问题?

提前谢谢你

【问题讨论】:

  • 另见?agrep帮助页面上的“注意”。该函数不会尝试匹配整个字符串。它尝试匹配子字符串。也许您正在寻找adist()

标签: r string-matching agrep


【解决方案1】:

也许以下可以解决您的问题。它在包stringdist 中使用stringdistmatrix,如果向量v1v2 较大,这可能会成为内存问题。

d <- stringdist::stringdistmatrix(v1, v2, method = "osa")
i <- which(colSums(d == 1) > 0)
j <- which(rowSums(d == 1) > 0)
df$v2[j] <- v2[i]

df
#      v1    v2
#1 yellow  <NA>
#2    red blues
#3 orange  <NA>
#4   blue  redx
#5  green grean

【讨论】:

    【解决方案2】:

    你可以试试:

    s <- which(adist(v1,v2) <= 1, TRUE) # 1 is the maximum allowed change
    data.frame(v1, v2=replace(NA, s[,1], v2[s[,2]]))
          v1    v2
    1 yellow  <NA>
    2    red  redx
    3 orange  <NA>
    4   blue blues
    5  green grean
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2013-04-15
      • 1970-01-01
      相关资源
      最近更新 更多