Reputation: 143
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
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