Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why double/numeric value in matrix return wrong answer by using %in% a range?

Tags:

r

I found integer and double values behaves differently in matrix and wrong answer returned for double data types only.

#Test
m <- matrix(1:12,4,3)
which(!m[1,] %in% 1:5)

which(!m[1,] %in% 1:5)
[1] 3

However, when I changed the values in double/numeric,

m <- matrix(c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6), 4,3)
which(!m[1,] %in% 0.10:0.35)

   [,1] [,2] [,3]
[1,]  0.1  0.5  0.3
[2,]  0.2  0.6  0.4
[3,]  0.3  0.1  0.5
[4,]  0.4  0.2  0.6

which(!m[1,] %in% 0.10:0.35)
[1] 2 3

only 2 should be in the answer because 1,3 are in the range of 0.10 to 0.35, why it is different in the computation using integer and numeric. Thanks!

like image 917
rpylearning Avatar asked Jun 08 '11 06:06

rpylearning


1 Answers

It's because you have a flawed understanding of what the : operator does. : does not indicate a range, but is indeed a shortcut to generate sequences of discrete values (at integer intervals).

Compare:

> 1:5
[1] 1 2 3 4 5

> 0.1:0.35
[1] 0.1

So your first bit of code tests whether a value is %in% the range of integers 1 to 5. But the second bit of code tests whether your data is equal to 0.1.

To get the result you are after, you need to write the following:

which(!(m[1, ] >= 0.1 & m[1, ] <= 0.35))
[1] 2
like image 146
Andrie Avatar answered Sep 28 '22 00:09

Andrie