优雅索引到向量/matrix的结尾

在R中是否可以说 – 我想要从位置i到vector/matrix的末尾的所有索引? 说我想从第三列开始的子matrix。 我目前只知道这种方式:

 A = matrix(rep(1:8, each = 5), nrow = 5) # just generate some example matrix... A[,3:dim(A)[2]] # get submatrix from 3rd column onwards 

但是,我真的需要写那个丑陋的dim(A)[2]吗? 怎么说“从第三栏开始”没有优雅的方式? 像A[,3:] ? (或A[,3:...] )?

有时候更容易告诉R你想要什么。 换句话说,使用负向索引排除matrix中的列:

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

 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 

但要回答你的问题,请问:使用ncolfind列的数量。 (同样有nrowfind行数。)

 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 

对于行(不是你的例子中的列),那么可以使用head()tail()

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

几乎是一样的

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

(打印的rownames /索引是不同的)。

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

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

对于列版本,你可以适应tail() ,但是有点棘手。 我想知道NROW()NCOL()在这里可能是有用的,而不是dim() NCOL()

 > 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的东西,而是要求它放弃一些东西。 这是一个封装了这个function的函数:

 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