Elegant indexing up to end of vector/matrix

前端 未结 3 1081
情歌与酒
情歌与酒 2020-12-08 01:45

Is it possible in R to say - I want all indices from position i to the end of vector/matrix? Say I want a submatrix from 3rd column onwards. I currently only kn

相关标签:
3条回答
  • 2020-12-08 02:04

    For rows (not columns as per your example) then head() and tail() could be utilised.

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

    is almost the same as

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

    (the rownames/indices printed are different is all).

    Those work for vectors and data frames too:

    > 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
    

    For the column versions, you could adapt tail(), but it is a bit trickier. I wonder if NROW() and NCOL() might be useful here, rather than 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
    

    Or flip this on its head and instead of asking R for things, ask it to drop things instead. Here is a function that encapsulates this:

    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
    
    0 讨论(0)
  • 2020-12-08 02:11

    You can use the following instruction:

    A[, 3:length(A[, 1])]
    
    0 讨论(0)
  • 2020-12-08 02:27

    Sometimes it's easier to tell R what you don't want. In other words, exclude columns from the matrix using negative indexing:

    Here are two alternative ways that both produce the same results:

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

    Results:

         [,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
    

    But to answer your question as asked: Use ncol to find the number of columns. (Similarly there is nrow to find the number of rows.)

    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
    
    0 讨论(0)
提交回复
热议问题