it-swarm.cn

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

在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:...])?

64
TMS

有时候更容易告诉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
83
Andrie

对于行(不是根据您的示例的列),可以使用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
16
Gavin Simpson

您可以使用以下说明:

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