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