rpylearning
rpylearning

Reputation: 143

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

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!

Upvotes: 6

Views: 632

Answers (1)

Andrie
Andrie

Reputation: 179438

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

Upvotes: 9

Related Questions