2015-09-15 2 views
1

У меня есть числовая матрица, из которой я хочу получить индекс, заданный для конкретных значений. Я пытаюсь использовать функцию which() для нахождения значений в матрице.Как получить значения из числовой матрицы, используя функцию() в R?

Проблема в том, что некоторые значения найдены, а некоторые нет.

Моя матрица выглядит следующим образом:

x_lat <- as.double(seq(48.0 ,60.0, by=0.1)) 
y_long <- as.double(seq(-10.0 ,2.0, by=0.1)) 
xv <- as.double(rep(x_lat,each = 121)) 
yv <- as.double(rep(y_long, 121)) 

vMatrix <- as.matrix(cbind(xv,yv)) 

Если я хочу, чтобы получить индексы, где значение -2,3 ИСТИНА функция корректно возвращает вектор с индексами, где -2.3 появляется.

xx<- which(vMatrix==-2.3,arr.ind=TRUE) 

> xx 
    [1] 78 199 320 441 562 683 804 925 1046 1167 1288 1409 1530 1651 1772 1893 2014 2135 2256 2377 2498 
[22] 2619 2740 2861 2982 3103 3224 3345 3466 3587 3708 3829 3950 4071 4192 4313 4434 4555 4676 4797 4918 5039 
[43] 5160 5281 5402 5523 5644 5765 5886 6007 6128 6249 6370 6491 6612 6733 6854 6975 7096 7217 7338 7459 7580 
[64] 7701 7822 7943 8064 8185 8306 8427 8548 8669 8790 8911 9032 9153 9274 9395 9516 9637 9758 9879 10000 10121 
[85] 10242 10363 10484 10605 10726 10847 10968 11089 11210 11331 11452 11573 11694 11815 11936 12057 12178 12299 12420 12541 12662 
[106] 12783 12904 13025 13146 13267 13388 13509 13630 13751 13872 13993 14114 14235 14356 14477 14598 

Но для некоторых чисел (которые появляются в матрице) функция не работает, например,

xx<- which(vMatrix==-2.2,arr.ind=TRUE) 

> xx 
integer(0) 

Любая помощь будет оценена

ответ

0

Числа с плавающей точкой может ввести в заблуждение. Два таких числа обычно не являются «равными», хотя консоль может отображать один и тот же вывод. Машина имеет определенную точность, с которой она может представлять числа.

Вот простой пример:

a <- 0.15 - 1/8 
b <- 0.025 
> a 
[1] 0.025 
> b 
[1] 0.025 

Однако, если сравнить эти цифры с «==», мы получим:

> a==b 
[1] FALSE 

Это происходит потому, что существуют различия, обусловленные плавающей точкой арифметические, которые превышают точность машины:

> a-b 
[1] -6.938894e-18 

Возможно, вы можете решить t он вопрос просто округление чисел в матрице до необходимого количества соответствующих цифр, как, например,

xx<- which(round(vMatrix,3)==-2.2,arr.ind=TRUE) 
+1

Значения на матрице есть только один десятичный, так что я не думаю, что это имело смысл округляя их на более высокий число десятичных знаков. Теперь я вижу, как это имеет смысл. Благодаря! – armg

+0

Добро пожаловать; Я рад, что могу помочь. – RHertel

+0

Использование 'round' - не очень хороший способ сравнения чисел с допуском с плавающей точкой. 'all.equal' реализует лучший способ. Подробнее: http://stackoverflow.com/a/9508558/1968 –

Смежные вопросы