【问题标题】:R agrep: how to match with more than 1 substitutionR agrep:如何匹配超过 1 个替换
【发布时间】:2014-09-13 10:12:28
【问题描述】:

我正在尝试将字符串与字符串向量匹配:

a <- c('abcde', 'abcdf', 'abcdg')

agrep('abcdh', a, max.distance=list(substitutions=1))
# [1] 1 2 3

agrep('abchh', a, max.distance=list(substitutions=2))
# character(0)

我没想到后一个结果是替换了两个字符 图案使图案与矢量元素相同。但是,这确实适用于 all 而不是 substitutions

agrep('abchh', a, max.distance=list(all=2))
# [1] 1 2 3

我需要更改哪些内容才能匹配允许超过 1 个替换? substitution 只是一个错误的选择吗?谢谢。

注意:这个问题与这个问题基本相同:https://stat.ethz.ch/pipermail/r-help/2011-June/281731.html,但从未得到回答。

【问题讨论】:

  • 如果你只想允许替换,你可以使用all=2, insertions=0, deletions=0, substitions=2。除了添加该行为之外,我无法解释该行为,例如,当字符串长度大于 10 时它会消失,因此可能链接到 If cost is not given, all defaults to 10%(来自 ?agrep
  • 嗯,对我来说,即使我使用很长的字符串,它也没有消失。它看起来确实有点马车,就像它在超越自己一样。但是解决方法是个好主意,谢谢!
  • 为了使用相同的比较,我将agrep("abchh", "abcdd", max.distance=list(substitutions=2))agrep("aaaaaaabchh", "aaaaaaabcdd", max.distance=list(substitutions=2)) 进行比较
  • 我试过这个并注意到 integer(0) 回来了,但也是 .2 和 .21 之间的区别 > agrep('abchh', a, max.distance=0.21) [1] 1 2 3 > agrep('abchh', a, max.distance=0.2) 整数(0)

标签: regex r agrep


【解决方案1】:

无论如何,我没有意识到这些问题已经那么老了:

函数需要cost才合适。正如ping所说,你必须设置匹配成本的最大数量;在你的例子中:

a <- c('abcde', 'abcdf', 'abcdg')
agrep('abcdh', a, max.distance = list(cost = 1))
[1] 1 2 3
agrep('abchh', a, max.distance = 2)
[1] 1 2 3

现在,如果您设置cost,程序可以进行插入、删除和替换。如果您只想评估替换,那么:

agrep('abhhh', a, 
        max.distance=list(cost=3, substitutions=3, 
                          deletions=0, insertions=0))
[1] 1 2 3

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多