首页 文章

优雅的索引直到矢量/矩阵的结尾

提问于
浏览
63

在R中是否可以说 - 我想要从位置 i 到向量/矩阵的末尾的所有索引?假设我想要从第3列开始的子矩阵 . 我目前只知道这种方式:

A = matrix(rep(1:8, each = 5), nrow = 5) # just generate some example matrix...

A[,3:ncol(A)] # get submatrix from 3rd column onwards

但我真的需要写 ncol(A) 吗?是不是有什么优雅的方式怎么说"from the 3rd column onwards"?像 A[,3:] 这样的东西? (或 A[,3:...] )?

3 回答

  • 16

    有时候更容易告诉R你想要什么 . 换句话说,使用否定索引从矩阵中排除列:

    以下两种方法可以产生相同的结果:

    A[, -(1:2)]
    A[, -seq_len(2)]
    

    结果:

    [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    3    4    5    6    7    8
    [2,]    3    4    5    6    7    8
    [3,]    3    4    5    6    7    8
    [4,]    3    4    5    6    7    8
    [5,]    3    4    5    6    7    8
    

    但要回答您提出的问题:使用 ncol 查找列数 . (同样有 nrow 来查找行数 . )

    A[, 3:ncol(A)]
    
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    3    4    5    6    7    8
    [2,]    3    4    5    6    7    8
    [3,]    3    4    5    6    7    8
    [4,]    3    4    5    6    7    8
    [5,]    3    4    5    6    7    8
    
  • 82

    对于行(不是根据您的示例的列),可以使用 head()tail() .

    A <- matrix(rep(1:8, each = 5), nrow = 5)
    tail(A, 3)
    

    几乎是一样的

    A[3:dim(A)[1],]
    

    (打印的rownames / indices是不同的) .

    那些也适用于矢量和数据帧:

    > tail(1:10, 4)
    [1]  7  8  9 10
    > tail(data.frame(A = 1:5, B = 1:5), 3)
      A B
    3 3 3
    4 4 4
    5 5 5
    

    对于列版本,您可以调整 tail() ,但它有点棘手 . 我想知道 NROW()NCOL() 在这里是否有用,而不是 dim() ?:

    > A[, 3:NCOL(A)]
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    3    4    5    6    7    8
    [2,]    3    4    5    6    7    8
    [3,]    3    4    5    6    7    8
    [4,]    3    4    5    6    7    8
    [5,]    3    4    5    6    7    8
    

    或者翻转它的头部,而不是向R询问东西,要求它放弃东西 . 这是一个封装它的函数:

    give <- function(x, i, dimen = 1L) {
        ind <- seq_len(i-1)
        if(isTRUE(all.equal(dimen, 1L))) { ## rows
            out <- x[-ind, ]
        } else if(isTRUE(all.equal(dimen, 2L))) { ## cols
            out <- x[, -ind]
        } else {
            stop("Only for 2d objects")
        }
        out
    }
    
    > give(A, 3)
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    [1,]    1    2    3    4    5    6    7    8
    [2,]    1    2    3    4    5    6    7    8
    [3,]    1    2    3    4    5    6    7    8
    > give(A, 3, dimen = 2)
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    3    4    5    6    7    8
    [2,]    3    4    5    6    7    8
    [3,]    3    4    5    6    7    8
    [4,]    3    4    5    6    7    8
    [5,]    3    4    5    6    7    8
    
  • 1

    您可以使用以下说明:

    A[, 3:length(A[, 1])]
    

相关问题