TMS*_*TMS 66 indexing r matrix dataframe
在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
Run Code Online (Sandbox Code Playgroud)
但我真的需要写ncol(A)吗?是不是有任何优雅的方式如何说"从第3列开始"?有点像A[,3:]?(或A[,3:...])?
And*_*rie 89
有时候告诉R你不想要什么更容易.换句话说,使用否定索引从矩阵中排除列:
以下两种方法可以产生相同的结果:
A[, -(1:2)]
A[, -seq_len(2)]
Run Code Online (Sandbox Code Playgroud)
结果:
[,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
Run Code Online (Sandbox Code Playgroud)
但要回答您的问题: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
Run Code Online (Sandbox Code Playgroud)
Rei*_*son 16
对于行(不按你的例子列),然后head()和tail()可以利用.
A <- matrix(rep(1:8, each = 5), nrow = 5)
tail(A, 3)
Run Code Online (Sandbox Code Playgroud)
几乎是一样的
A[3:dim(A)[1],]
Run Code Online (Sandbox Code Playgroud)
(打印的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
Run Code Online (Sandbox Code Playgroud)
对于列版本,您可以适应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
Run Code Online (Sandbox Code Playgroud)
或者翻转它的头部,而不是向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
Run Code Online (Sandbox Code Playgroud)