【问题标题】:check if all characters of one string exist in another string in r检查一个字符串的所有字符是否存在于r中的另一个字符串中
【发布时间】:2016-03-18 13:10:56
【问题描述】:

我正在尝试比较像 PRABHAKAR SHARMASHARMA KUMAR PRABHAKAR 这样的字符串。目的是检查较短字符串的所有字符是否存在于另一个字符串中。如果是这种情况,我应该得到一个 100% 的匹配,否则一个百分比表示匹配的字符百分比。

我尝试在RecordLinkage 包中使用levenshteinSim,但它给出的数字对应于将一个字符串更改为另一个字符串所需的更改次数。

install.packages("RecordLinkage")
require(RecordLinkage)
levenshteinSim("PRABHAKAR SHARMA","SHARMA KUMAR PRABHAKAR")

#[1] 0.3636364

在这种情况下,我想要 100% 的匹配。此外,这必须复制超过 1,000,000 条记录。

【问题讨论】:

  • 你的意思是短字符串中的所有字符还是所有单词都需要在长字符串中匹配?
  • 如果您正在寻找单词匹配,您可以尝试类似long_strings <- "SHARMA KUMAR PRABHAKAR"; short_strings <- "PRABHAKAR SHARMA"; mapply(function(l, s) mean(s %in% l), strsplit(long_strings, " "), strsplit(short_strings, " "))
  • 所有字符..它可能会进一步混乱..例如-“PRA SHARBHAK ARRMA”和“PRABHAKAR SHARMA KUMAR”..

标签: r string-matching


【解决方案1】:

这是一种方法

s1 <- "PRABHAKAR SHARMA"
s2 <- "SHARMA KUMAR PRABHAKAR"

compare <- function(s1, s2) {
    c1 <- unique(strsplit(s1, "")[[1]])
    c2 <- unique(strsplit(s2, "")[[1]])
    length(intersect(c1,c2))/length(c1)
}

compare(s1,s2)
#1

不过,它可能有点慢。它也将空格字符视为字符。使用Vectorize 应用于列:

dat <- data.frame(small=c("a", "b"), big=c("aa", "cc"), stringsAsFactors=FALSE)
vcomp <- Vectorize(compare)
dat <- transform(dat, comp=vcomp(small, big))

【讨论】:

  • 您可以使用布尔参数检查是否区分大小写,非常好:)
  • 谢谢 Karsten .. 这是完美的.. 你能建议一种方法来复制它来比较数据框的两列吗?
  • 编辑答案以解决列大小写问题。
  • 感谢@KarstenW 提供用于比较数据框两列的代码。它似乎只匹配相应的行。您能否建议如何迭代两个数据帧,以便“a”不仅与“aa”相比,还与“cc”相比?谢谢!
【解决方案2】:

如果要考虑的字符只是您可以使用的字母:

comp <- function(s1, s2){         
     in1 = letters %in% strsplit(tolower(s1), "")[[1]]
     in2 = letters %in% strsplit(tolower(s2), "")[[1]]
     sum(in1 & in2)/sum(in1)
}

【讨论】:

    猜你喜欢
    • 2021-03-15
    • 2012-10-04
    • 1970-01-01
    • 2011-03-24
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多