2014-11-14 37 views
0

在比較數字或向量時,R中是否有寫入函數允許有誤差容限?如果這兩個值在指定的容許誤差範圍內,則x == y將計算爲TRUE。比較允許有特定的誤差範圍的值

示例如果目標值是77並且我的允許誤差範圍是5%,問問題x == 77?如果x在77左右的5%誤差範圍內,即在73.15和80.85之間的任何x值將評估爲TRUE,則評估爲TRUE。

我可以對一個函數做「==」比較,但不能提出一個解決方案,在每個目標值周圍建立一個「接受」範圍,這樣如果我的允許誤差範圍是5% ,任何落在tgt值+/- 5%範圍內的dta元素都將評估爲TRUE。

tgt <- c(45,77,92) 
dta <- c(33,41,44,60,68,71,77,78,87,95) 
sapply(tgt, function(i) i==dta) 

這比較tgt和dta的每一個。返回TRUE的唯一比較是77與77進行比較。我必須圍繞每個tgt元素構建一個範圍,然後將每個dta元素與該範圍進行比較,只要任何dta元素落入任何創建的範圍內,該範圍就會返回true。當我開始構建我感到困惑的範圍時。在44比45,因爲它是由不到5%的短我正在尋找將評估爲true的結果,同樣78就足以77接近評價爲真,以及95至92

+0

使用'all.equal()' – Andrie 2014-11-14 15:51:40

+0

同樣的答案:http://stackoverflow.com/questions/9508518/why-are-these-numbers-not-equal – Andrie 2014-11-14 15:52:57

+0

all.equal不允許將容差設置爲5%或目標有10%嗎? – user2004820 2014-11-14 16:04:07

回答

2
neighbour <- function(x, y, tol=0.1){ 
    sapply(x, function(.x) {.tol <- tol * pmax(.x, y) ; abs(.x - y) <= .tol}) 
} 

tgt <- c(45,77,92) 
dta <- c(33,41,44,60,68,71,77,78,87,95) 

neighbour(x=tgt, y=dta) 
+0

謝謝! – user2004820 2014-11-14 16:19:55