R 获取矩阵的最后一个元素
假设我有以下矩阵R 获取矩阵的最后一个元素,r,matrix,R,Matrix,假设我有以下矩阵 M <- matrix(1:9, 3, 3) M # [,1] [,2] [,3] # [1,] 1 4 7 # [2,] 2 5 8 # [3,] 3 6 9 有更好的方法吗?R中的矩阵只是一个带有dim属性的向量,所以您可以将其子集为一个 M[length(M)] ## [1] 9 不过(正如@James所提到的),如果您想保持矩阵结构,您的解决方案可以更一般,因为您可以添加drop=FALSE M
M <- matrix(1:9, 3, 3)
M
# [,1] [,2] [,3]
# [1,] 1 4 7
# [2,] 2 5 8
# [3,] 3 6 9
有更好的方法吗?R中的矩阵只是一个带有
dim
属性的向量,所以您可以将其子集为一个
M[length(M)]
## [1] 9
不过(正如@James所提到的),如果您想保持矩阵结构,您的解决方案可以更一般,因为您可以添加
drop=FALSE
M[nrow(M), ncol(M), drop = FALSE]
# [,1]
# [1,] 9
不过,我的解决方案也可以使用dim以类似的方式进行修改,我宁愿这样做:
tail(c(M),1)
# [1] 9
要做到这一点并避免不必要地重复对象名(或愚蠢的打字错误),一种方法是使用管道。他喜欢这样:
require(magrittr)
M %>% .[nrow(.), ncol(.)]
##[1] 9
M %>% `[`(nrow(.), ncol(.))
##[1] 9
M %>% extract(nrow(.), ncol(.))
##[1] 9
这些方法是等效的,因此您可以选择您觉得更直观的方法 但是op提出的方法是完全正确的,并且稍微不会混淆目标。@Roland我同意它是“正确的”,但我认为op没有意识到他只处理向量,并且在R中处理矩阵时需要意识到这一点。我的评论只是一个增编。我已经投了赞成票(并且一直在准备相同的答案)。@DavidArenburg-Benchmark明确表示我可以继续使用M[长度(M)]。谢谢lot@SamuelAlexander这里没有“权利”。所有方法都可以使用,其中三种方法在几乎所有用途上都具有相同的性能。这也是一个很好的解决方案,但您应该解释一下,c
删除所有属性(包括dim
属性),从而将矩阵强制为原子向量as.vector
通常更适合这样做(我记得B.Ripley对此的引用)。有趣的是,还没有经历过c
和as.vector
as.vector
之间的属性撤销。如果结果是原子的,那么vector也会删除所有属性。使用它的原因是代码更清晰。@罗兰此方法的主要问题是c
创建了整个矩阵的副本,您可以使用traceem
进行验证。虽然优点是,当我们想要选择多个值时,它更灵活。
M <- matrix(runif(1000000),nrow=1000)
microbenchmark(
nrow_ncol={
M[nrow(M),ncol(M)]
},
dim12={
M[dim(M)[1],dim(M)[2]]
},
length1={
M[length(M)]
},
tail1={
tail(c(M),1)
},
times = 1000
)
# Unit: nanoseconds
# expr min lq mean median uq max neval cld
# nrow_ncol 605 1209 3799.908 3623.0 6038 27167 1000 a
# dim12 302 605 2333.241 1811.0 3623 19922 1000 a
# length1 0 303 2269.564 1510.5 3925 14792 1000 a
# tail 1 3103005 3320034 4022028.561 3377234.0 3467487 42777080 1000 b
tail(c(M),1)
# [1] 9
require(magrittr)
M %>% .[nrow(.), ncol(.)]
##[1] 9
M %>% `[`(nrow(.), ncol(.))
##[1] 9
M %>% extract(nrow(.), ncol(.))
##[1] 9