R - 将矩阵从底部按行转换为向量

3

我有以下矩阵:

m <- matrix(1:9, ncol=3, byrow=TRUE)
m
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

我需要将其扁平化,即转换为向量。

然而,与其沿着列进行操作:

as.vector(m)
[1] 7 4 1 8 5 2 9 6 3

我需要得到的向量沿着行从底部向右方延伸,例如:

[1] 7 8 9 4 5 6 1 2 3

我该怎么做?

3个回答

6

1) 将第一维反转,进行转置,然后展开:

c(t(m[nrow(m):1, ]))
## [1] 7 8 9 4 5 6 1 2 3

2) 这里是第二种方法,它计算索引然后再应用它们。虽然较长但避免了转置:

nr <- nrow(m)
nc <- ncol(m)
c(m[cbind(rep(nr:1, each = nc), 1:nc)])
## [1] 7 8 9 4 5 6 1 2 3

2a) (2) 的一种变体是使用 1d 索引:

m[rep(nr:1, each = nc) + nr * (0:(nc - 1))]
## [1] 7 8 9 4 5 6 1 2 3

注意

我尝试了一个100x100和一个1000x1000的矩阵。在第一种情况下,(1)是最快的,在第二种情况下,(2)和(2a)是最快的,因此如果速度是一个问题,实际的维度似乎会影响选择哪个。


1
一种选择也可以使用asplit()
unlist(rev(asplit(m, 1)))

[1] 7 8 9 4 5 6 1 2 3

0
也许你可以使用以下方式:
  • 解决方案1:

    as.vector(t(apply(m, 2, rev)))
    

    结果为:

    > as.vector(t(apply(m, 2, rev)))
    [1] 7 8 9 4 5 6 1 2 3
    
  • 解决方案2:

    unlist(rev(data.frame(t(m))),use.names = F)
    

    结果为:

    > unlist(rev(data.frame(t(m))),use.names = F)
    [1] 7 8 9 4 5 6 1 2 3
    

谢谢,两种解决方案都可以,第二种似乎是最快的。 - thiagoveloso
1
是的,在解决方案1中,当处理大矩阵时,apply()可能会成为瓶颈。 - ThomasIsCoding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接