2013-04-30 62 views
3

我试图数字匹配向量,如下:匹配不起作用

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%尝试了类似的语法,它产生了完全相同的结果。

那么在语法上有什么问题?我应该如何解决它?

感谢您的输入。

+1

浮点错误:'T [25] == tifl.m'返回'FALSE'所以'match'和'%in%也会。你可以使用'all.equal'函数编写你自己的匹配模型,它可以“模糊”匹配! – Justin 2013-04-30 22:10:09

+1

我想如果你打算提出一个问题**“功能XXX不起作用”**最好确定这是一个功能问题而不是用户 – 2013-04-30 23:08:46

回答

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 
+0

+1非常好! 。 – 2013-04-30 23:10:02

+0

演示“isTRUE(all.equal(。))”组合的要点。 – 2013-04-30 23:45:05

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 

如果你想有糖耐量因子然后就减去一个“模糊”:

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

根据浮动的符号点错误,这可能是正确的或错误的'1'。此外,即使第一个元素不是't'的成员,它也会始终返回结果,而match将返回NA。 – flodel 2013-04-30 22:58:15

+0

我通常在左边加一个'-Inf',在右边加上'Inf',所以不需要加1。左边的间隔是闭合的(我通常更喜欢),并且它与默认的“cut行为。 – 2013-04-30 23:28:04

+1

我不是在谈论终点。想一想'findInterval(1.5,c(1,2))'和'match(1.5,c(1,2))'都给了什么。 – flodel 2013-05-01 00:01:45