子集一个矩阵,如果索引无效则得到NA

时间:2014-09-12 02:53:01

标签: r matrix subset

我正在尝试将矩阵子集化以始终获得3 * 3矩阵。

例如,作为子集的矩阵是a<-matrix(1:15,3,5),通常当我使用a[0:2,0:2]对其进行子集化时,我得到:

      [,1] [,2]
[1,]    1    4
[2,]    2    5

但我希望得到类似的东西:

      [,1] [,2] [,3]
[1,]   NA    NA   NA
[2,]   NA    1    4
[3,]   NA    2    5

2 个答案:

答案 0 :(得分:4)

当您选择时,强制所有0NA,以及任何超出范围的&#39;值:

ro <- 0:2
co <- 0:2
a[replace(ro,ro == 0 | ro > nrow(a),NA),
  replace(co,co == 0 | co > ncol(a),NA)]

#     [,1] [,2] [,3]
#[1,]   NA   NA   NA
#[2,]   NA    1    4
#[3,]   NA    2    5

这甚至可以与您想要丢失的部分组合起作用:

ro <- c(1,0,2)
co <- 0:2
a[replace(ro,ro == 0 | ro > nrow(a),NA),
  replace(co,co == 0 | co > ncol(a),NA)]

#     [,1] [,2] [,3]
#[1,]   NA    1    4
#[2,]   NA   NA   NA
#[3,]   NA    2    5

答案 1 :(得分:1)

您可以创建自己的填充功能,以通过NA值填充小于3x3的空间

padmatrix <- function(a, dim=c(3,3)) {
    stopifnot(all(dim(a)<=dim))
    cbind(rep(NA,dim[2]-ncol(a)), rbind(rep(NA,dim[1]-nrow(a)), a))
}

padmatrix(a[1:2, 1:2])
#      [,1] [,2] [,3]
# [1,]   NA   NA   NA
# [2,]   NA    1    4
# [3,]   NA    2    5