# R Language Subsetting Matrices

## Example

For each dimension of an object, the `[` operator takes one argument. Vectors have one dimension and take one argument. Matrices and data frames have two dimensions and take two arguments, given as `[i, j]` where `i` is the row and `j` is the column. Indexing starts at 1.

``````## a sample matrix
mat <- matrix(1:6, nrow = 2, dimnames = list(c("row1", "row2"), c("col1", "col2", "col3")))

mat
#      col1 col2 col3
# row1    1    3    5
# row2    2    4    6
``````

`mat[i,j]` is the element in the `i`-th row, `j`-th column of the matrix `mat`. For example, an `i` value of `2` and a `j` value of `1` gives the number in the second row and the first column of the matrix. Omitting `i` or `j` returns all values in that dimension.

``````mat[ , 3]
## row1 row2
##    5    6

mat[1, ]
# col1 col2 col3
#    1    3    5
``````

When the matrix has row or column names (not required), these can be used for subsetting:

``````mat[ , 'col1']
# row1 row2
#    1    2
``````

By default, the result of a subset will be simplified if possible. If the subset only has one dimension, as in the examples above, the result will be a one-dimensional vector rather than a two-dimensional matrix. This default can be overriden with the `drop = FALSE` argument to `[`:

``````## This selects the first row as a vector
class(mat[1, ])
#  "integer"

## Whereas this selects the first row as a 1x3 matrix:
class(mat[1, , drop = F])
#  "matrix"
``````

Of course, dimensions cannot be dropped if the selection itself has two dimensions:

``````mat[1:2, 2:3]  ## A 2x2 matrix
#      col2 col3
# row1    3    5
# row2    4    6
``````

### Selecting individual matrix entries by their positions

It is also possible to use a Nx2 matrix to select N individual elements from a matrix (like how a coordinate system works). If you wanted to extract, in a vector, the entries of a matrix in the `(1st row, 1st column), (1st row, 3rd column), (2nd row, 3rd column), (2nd row, 1st column)` this can be done easily by creating a index matrix with those coordinates and using that to subset the matrix:

``````mat
#      col1 col2 col3
# row1    1    3    5
# row2    2    4    6

ind = rbind(c(1, 1), c(1, 3), c(2, 3), c(2, 1))
ind
#      [,1] [,2]
# [1,]    1    1
# [2,]    1    3
# [3,]    2    3
# [4,]    2    1

mat[ind]
#  1 5 6 2
``````

In the above example, the 1st column of the `ind` matrix refers to rows in `mat`, the 2nd column of `ind` refers to columns in `mat`. PDF - Download R Language for free