R中匹配函数的奇怪行为

Strange behavior of match function in R

我试图找出为什么 match 函数在比较两个数值向量时表现出奇怪的行为。它显然与值的精度有关,但我一直无法找到对该问题的良好描述。我已经能够使用 zapsmall 解决问题,但想知道是否有更好的方法。

示例:

a <- seq(1,1.9,0.1)
a
# [1] 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9

b <- seq(0,1.9,0.1)
b
# [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9

match(a,b)
# [1] 11 12 NA 14 NA 16 17 18 19 20

match(zapsmall(a),zapsmall(b))
# [1] 11 12 13 14 15 16 17 18 19 20

我发现一种可能的解决方案是使用 pmatch ("Partial String Matching"),尽管函数首先使用 as.character 转换为字符向量。我敢肯定在某些情况下这会导致问题,但它适用于这种情况:

pmatch(a,b)
#[1] 11 12 13 14 15 16 17 18 19 20

我发现

a <- 10:19 / 10
a
# [1] 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9

b <- 0:19 / 10
b
# [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9

match(a,b)
#  [1] 11 12 13 14 15 16 17 18 19 20

效果很好(没有字符转换),所以问题可能是 "seq" 而不是 "match"。