优雅的索引到向量/矩阵的末尾
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 确定每个矩阵列中的最小元素及其位置