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"。
我试图找出为什么 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"。