【问题标题】:How to reverse a matrix in R? [duplicate]如何反转R中的矩阵? [复制]
【发布时间】:2012-02-03 21:33:29
【问题描述】:

我有一个简单的矩阵,例如:

> a = matrix(c(c(1:10),c(10:1)), ncol=2)
> a
      [,1] [,2]
 [1,]    1   10
 [2,]    2    9
 [3,]    3    8
 [4,]    4    7
 [5,]    5    6
 [6,]    6    5
 [7,]    7    4
 [8,]    8    3
 [9,]    9    2
[10,]   10    1

我想得到这个结果:

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

矩阵的完全相反。我怎么才能得到它? 谢谢

【问题讨论】:

  • 从您使用的示例中,尚不清楚您是要反转列还是行。只是为了记录,Dirk 的解决方案颠倒了行的顺序,而我的解决方案颠倒了列的顺序。
  • 就是这么说的。我最终自己使用了 Josh 的解决方案,因为我正在寻找反转列。也许你可以编辑它,这样你就有一个更像矩阵的矩阵(1:20,nrow = 10)
  • 如果您将 Josh 或 Dirk 的解决方案应用于具有单一维度的数组,R 将折叠它们。您可以像这样包装调用:array(reversing.thing, dim = dim(thing)) 以防止它发生。

标签: r


【解决方案1】:
a[nrow(a):1,]
#       [,1] [,2]
#  [1,]   10    1
#  [2,]    9    2
#  [3,]    8    3
#  [4,]    7    4
#  [5,]    6    5
#  [6,]    5    6
#  [7,]    4    7
#  [8,]    3    8
#  [9,]    2    9
# [10,]    1   10

【讨论】:

  • 这是此处列出的最快的解决方案。 a[dim(a)[1]:1, ] (稍微)更快,但可读性较差。
【解决方案2】:

试试revapply

> a <- matrix(c(1:10,10:1), ncol=2)
> a
      [,1] [,2]
 [1,]    1   10
 [2,]    2    9
 [3,]    3    8
 [4,]    4    7
 [5,]    5    6
 [6,]    6    5
 [7,]    7    4
 [8,]    8    3
 [9,]    9    2
[10,]   10    1
> b <- apply(a, 2, rev)
> b
      [,1] [,2]
 [1,]   10    1
 [2,]    9    2
 [3,]    8    3
 [4,]    7    4
 [5,]    6    5
 [6,]    5    6
 [7,]    4    7
 [8,]    3    8
 [9,]    2    9
[10,]    1   10

【讨论】:

  • 为什么不旋转两次? stackoverflow.com/a/16497058/54964 例如来自文档存档的rotate = function(mat) t(mat[nrow(mat):1,,drop=FALSE])
  • 它比a[, ncol(a):1] 方法慢得多,但它的优点是可以内联声明b:b = apply(matrix(c(1:10, 10:1), 10, 2), 2, rev)
  • @dirk-eddelbuettel 非常感谢。这是matlab::flipud 的一个非常好的和完美的替代品。在使用该功能时,人们可能会遇到很多错误,但在您的解决方案中,非常整洁和完美,没有出现错误。 Flipud 的此类错误之一是error in evaluating the argument 'object' in selecting a method for function 'flipud': Error in .findInheritedMethods(classes, fdef, mtable) : trying to get slot "group" from an object (class "nonstandardGenericFunction") that is not an S4 object。再一次,非常感谢德克。确实,在许多情况下,您的解决方案是救命稻草。
【解决方案3】:

这是一种方法:

a[, rev(seq_len(ncol(a)))]
      [,1] [,2]
 [1,]   10    1
 [2,]    9    2
 [3,]    8    3
 [4,]    7    4
 [5,]    6    5
 [6,]    5    6
 [7,]    4    7
 [8,]    3    8
 [9,]    2    9
[10,]    1   10

【讨论】:

  • 这也适用于数组中任何更高维数,谢天谢地——只需添加更多逗号并将ncol() 替换为dim()[n]
  • 为什么不只是ncol(a):1
  • @MichaelChirico 虽然我不是 R 专家,但您的解决方案似乎有效并且对我来说更优雅,所以我想说添加它作为答案!
  • @doncherry 谢谢,但它与 Per 的解决方案相同(在行而不是列上)
  • @MichaelChirico 实际上,您的解决方案和 Per 的解决方案做的事情完全不同(尽管使用此处给出的示例数据,结果是相同的)。您的答案和我的答案使用垂直对称线反映矩阵,而 Per 的答案通过水平对称线反映矩阵。 (无法确定 OP 想要哪个,尽管鉴于他们接受了 Dirk 的回答,看起来他们想要的是他和 Per 给他们的东西,而不是你和我所做的。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多