匹配不起作用

时间:2013-04-30 22:05:54

标签: r match

我试图将数字与向量匹配,如下所示:

t <- seq(-4,4,length=81)

tifl.e <--1.5
tifc.e <--0.5
tifr.e <-0.5
tifl.m <--1.6
tifc.m <--0.4
tifr.m <-0.8

match( c(tifl.e, tifc.e, tifr.e), t)
[1] 26 36 46
match( c(tifl.m, tifc.m, tifr.m), t)
[1] NA NA NA

我也尝试了代码,但结果相同。

tifl.cut <-c(-1.5,-1.6)
tifc.cut <-c(-0.5,-0.4)
tifr.cut <-c(0.5,0.8)

match( c(tifl.cut[1], tifc.cut[1], tifr.cut[1]), t)
[1] 26 36 46
match( c(tifl.cut[2], tifc.cut[2], tifr.cut[2]), t)
[1] NA NA NA

与此同时,我通过使用%in%尝试了类似的语法,这产生了完全相同的结果。

那么语法中的问题是什么?我该如何解决?

感谢您的投入。

2 个答案:

答案 0 :(得分:5)

处理浮点错误的正确方法是使用all.equal。这是一个自定义函数,用于将match应用于数值并解释浮点错误的可能性:

match.numeric <- function(x, table) {
   are.equal <- function(x, y) isTRUE(all.equal(x, y))
   match.one <- function(x, table)
      match(TRUE, vapply(table, are.equal, logical(1L), x = x))
   vapply(x, match.one, integer(1L), table)
}

match.numeric(c(tifl.e, tifc.e, tifr.e), t)
# [1] 26 36 46
match.numeric(c(tifl.m, tifc.m, tifr.m), t)
# [1] 25 37 49

答案 1 :(得分:1)

我认为你真的想要findInterval而不是match

 findInterval( c(tifl.e, tifc.e, tifr.e), t)
#[1] 26 36 46
 tifl.m <--1.6
 tifc.m <--0.4
 tifr.m <-0.8
 findInterval( c(tifl.m, tifc.m, tifr.m), t)
#[1] 24 36 48

如果你想拥有容差因子,那么只需减去&#34; fuzz&#34;:

findInterval( c(tifl.m, tifc.m, tifr.m)- 1e-10, t)
#[1] 24 36 48