2013-04-30 61 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