查找多个候选人中多个子字符串的最佳匹配

时间:2019-12-19 20:12:03

标签: r grep substring

我有以下示例数据:

targets <- c("der", "das")
candidates <- c("sdassder", "sderf", "fongs")

所需的输出:

我想找到sdassder作为输出,因为它包含targets(作为子字符串)的最多匹配项。

我尝试过的事情:

x <- sapply(targets, function(target) sapply(candidates, grep, pattern = target)) > 0
which.max(rowSums(x))

目标:

如您所见,我发现一些脏代码在技术上会产生结果,但我不认为这是最佳实践。我希望此问题适合此处,否则我将进行代码审查。

我尝试了mapply,do.call,external,但是没有找到更好的代码。

3 个答案:

答案 0 :(得分:4)

我想您可以简化一下。

matches <- sapply(targets, grepl, candidates)
matches
#        der   das
# [1,]  TRUE  TRUE
# [2,]  TRUE FALSE
# [3,] FALSE FALSE

并使用rowSums查找匹配数:

rowSums(matches)
# [1] 2 1 0
candidates[ which.max(rowSums(matches)) ]
# [1] "sdassder"

(请注意,最后一部分并没有真正说明联系。)

如果您想查看每个候选人的个人匹配项,则始终可以手动应用名称,尽管这只是一种美学目的,对作品本身的添加很少。

rownames(matches) <- candidates
matches
#            der   das
# sdassder  TRUE  TRUE
# sderf     TRUE FALSE
# fongs    FALSE FALSE
rowSums(matches)
# sdassder    sderf    fongs 
#        2        1        0 
which.max(rowSums(matches))
# sdassder 
#        1        <------ this "1" indicates the index within the rowSums vector
names(which.max(rowSums(matches)))
# [1] "sdassder"

答案 1 :(得分:3)

一个stringr选项可能是:

candidates[which.max(rowSums(outer(candidates, targets, str_detect)))]

[1] "sdassder"

答案 2 :(得分:0)

我们可以将<AnimatedTextInput style={[styles.textInput, animatedTranslateStyle]} onChangeText={text => onChangeText(text)} value={value} placeholder="Search for an item" enablesReturnKeyAutomatically clearButtonMode={'always'} returnKeyType="search" selectionColor="red" /> 粘贴在一起,并创建一个匹配的模式。

targets

library(stringr) str_c(targets, collapse = "|") #[1] "der|das" 中使用它来计算匹配模式的次数。

str_count

获取最大值的索引,并将其从原始str_count(candidates, str_c(targets, collapse = "|")) #[1] 2 1 0 的子集中

candidates