优雅的索引到向量/矩阵的末尾

Posted

技术标签:

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

是否可以在 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:...])?

【问题讨论】:

【参考方案1】:

您可以使用以下指令:

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

【讨论】:

如果你要做很多子集,首先创建 dima <- dim(A) 然后引用它,例如`A[,3:dima[1]]` 您的length(A[, 1]) 给出了行数,但您正在为列编制索引。如果您想使用这种方法,则应改为3:length(A[1,])【参考方案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】:

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

【讨论】:

以上是关于优雅的索引到向量/矩阵的末尾的主要内容,如果未能解决你的问题,请参考以下文章

使用 CUDA Thrust 确定每个矩阵列中的最小元素及其位置

C ++:终止遍历字符串向量的循环的最优雅方法?

创建参考向量的优雅方式

使用 STL 算法在表(向量的向量、二维数组)中查找最小值/最大值的优雅方法

如何将字符串向量内爆成字符串(优雅的方式)

MATLAB 是不是提供了一种更优雅的方式来遍历 3D 数组以获取 3 维向量?