矩阵

对于对象的每个维度,[ 运算符采用一个参数。向量具有一个维度并且采用一个参数。矩阵和数据框有两个维度,有两个参数,以 [i, j] 给出,其中 i 是行,j 是列。索引从 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] 是矩阵 mat 的 tihuan 第 6 行 j-th 的元素。例如,2i 值和 1j 值给出了矩阵的第二行和第一列中的数字。省略 ij 将返回该维度中的所有值。

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

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

当矩阵具有行名或列名(不需要)时,这些可用于子集化:

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

默认情况下,如果可能,将简化子集的结果。如果子集仅具有一个维度,如上面的示例中那样,结果将是一维向量而不是二维矩阵。可以使用 [drop = FALSE 参数覆盖此默认值:

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

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

当然,如果选择本身有两个维度,则不能删除维度:

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

按位置选择单个矩阵条目

也可以使用 Nx2 矩阵从矩阵中选择 N 个单独的元素(如坐标系如何工作)。如果你想在向量中提取 (1st row, 1st column), (1st row, 3rd column), (2nd row, 3rd column), (2nd row, 1st column) 中矩阵的条目,可以通过创建一个带有这些坐标的索引矩阵并使用它来对矩阵进行子集来轻松完成:

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] 1 5 6 2

在上面的例子中,ind 矩阵的第 1 列是指 mat 中的行,ind 的第 2 列是指 mat 中的列。