# How to build a matrix product of a comparison with a range of values?

## Question:

Let's suppose we have a `data.frame` like the following:

``````set.seed(2019)
datos <- data.frame(ANO1=sample(1:10, 10, replace = TRUE),
ANO2=sample(1:10, 10, replace = TRUE))
datos

ANO1 ANO2
1     8    8
2     8    7
3     4    3
4     7    2
5     1    7
6     1    7
7     9    1
8     1    8
9     2    4
10    7    5
``````

What I am looking for is to create a matrix with the logical value of comparing if the two columns are less than a certain set of numbers, for example, let's say a range from 1 to 10, taking as reference the first row, I would like to obtain something like this :

``````   ANO1 ANO2     1     2     3     4     5     6     7     8     9   10
1     8    8 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE TRUE
``````

In this case the two `8` 's are less than `10` and `9` but not less than the rest of the values.

One way that occurs to me is to create a reference matrix to compare, that is, we are going to create a matrix with the 10 "comparables" and the number of rows of the `data.frame` , that is:

``````nr <- nrow(datos)
mref <- matrix(rep(1:10, nr), nrow = nr , byrow = TRUE)
mref

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    2    3    4    5    6    7    8    9    10
[2,]    1    2    3    4    5    6    7    8    9    10
[3,]    1    2    3    4    5    6    7    8    9    10
[4,]    1    2    3    4    5    6    7    8    9    10
[5,]    1    2    3    4    5    6    7    8    9    10
[6,]    1    2    3    4    5    6    7    8    9    10
[7,]    1    2    3    4    5    6    7    8    9    10
[8,]    1    2    3    4    5    6    7    8    9    10
[9,]    1    2    3    4    5    6    7    8    9    10
[10,]    1    2    3    4    5    6    7    8    9    10
``````

Having this, and thanks to the fact that the comparisons are actually functions, we could individually compare each column with its reference value:

``````a <- `<`(datos\$ANO1, mref)
b <- `<`(datos\$ANO2, mref)
``````

Note: I originally thought it wouldn't work, but it's totally okay to do:

``````a <- datos\$ANO1 < mref
b <- datos\$ANO2 < mref
``````

And now we simply make sure that both columns are less than the reference value with an `&` (array logical `and` ), the combination of the results is only for the purpose of verifying the results:

``````cbind(datos, a & b)

ANO1 ANO2     1     2     3     4     5     6     7     8     9   10
1     8    8 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE TRUE
2     8    7 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE TRUE
3     4    3 FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE TRUE
4     7    2 FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE TRUE
5     1    7 FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE TRUE
6     1    7 FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE TRUE
7     9    1 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
8     1    8 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE TRUE
9     2    4 FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE TRUE
10    7    5 FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE TRUE
``````
Scroll to Top