【问题标题】:Elegant indexing up to end of vector/matrix优雅的索引到向量/矩阵的末尾
【发布时间】:2011-09-21 13:33:21
【问题描述】:

是否可以在 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)吗?没有任何优雅的方式怎么说“从第 3 列开始”吗?像A[,3:] 这样的东西? (或A[,3:...])?

【问题讨论】:

    标签: r matrix dataframe indexing


    【解决方案1】:

    有时告诉 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
    

    【讨论】:

      【解决方案2】:

      对于行(不是您的示例中的列),则可以使用 head()tail()

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

      几乎是一样的

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

      (打印的行名/索引都不同)。

      这些也适用于向量和数据框:

      > 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
      

      【讨论】:

        【解决方案3】:

        您可以使用以下指令:

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

        【讨论】:

        • 如果你要做很多子集,首先创建 dima &lt;- dim(A) 然后引用它,例如`A[,3:dima[1]]`
        • 您的length(A[, 1]) 给出了行数,但您正在为列编制索引。如果您想使用这种方法,则应改为3:length(A[1,])
        猜你喜欢
        • 2013-05-27
        • 2017-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多