我有一个简单的矩阵:
mat = rbind(c(1:3),c(4:6),c(7:9))
mat
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6
# [3,] 7 8 9
我想现在逐行反转矩阵。那是我想获得的:
revMat
# [,1] [,2] [,3]
# [1,] 3 2 1
# [2,] 6 5 4
# [3,] 9 8 7
要做到这一点,我试过
apply(mat, 1, rev)
结果是:
# [,1] [,2] [,3]
# [1,] 3 6 9
# [2,] 2 5 8
# [3,] 1 4 7
我觉得这很奇怪。就像行被反转然后最终矩阵被转置一样。我不明白为什么。如果我简单地尝试,例如,
apply(mat, 2, rev)
它给了我预期的每列反转
# [,1] [,2] [,3]
# [1,] 7 8 9
# [2,] 4 5 6
# [3,] 1 2 3
因此,要获得最终结果,我必须执行
t(apply(t(bg), 2, rev))
因此,获得所需的矩阵对我来说不是问题,但我不理解"异常"在apply / reverse的行为中。任何人都可以向我解释这个吗?
编辑:为了明确区分,我已经知道如何进行逆转。我想知道为什么会这样。如何从许多早期的问题中清楚地看出,包括
答案 0 :(得分:7)
apply
始终将结果放在第一维中。有关详细信息,请参阅?apply
。假设这个输入:
mat <- matrix(1:9, 3, byrow = TRUE)
这里有一些替代方案:
1)转置
t(apply(mat, 1, rev))
2)避免申请索引
mat[, 3:1]
3)iapply 此处发布了幂等申请: https://stat.ethz.ch/pipermail/r-help/2006-January/086064.html 使用我们:
iapply(mat, 1, rev)
还有一个幂等申请iapply
,在版本0.8.0版本的重塑包中(但不是最新版本的重塑版):https://cran.r-project.org/src/contrib/Archive/reshape/
4)rollapply rollapply
:
library(zoo)
rollapply(mat, 1, rev, by.column = FALSE)
5)tapply tapply
表达式返回一个列表,让我们有机会按照我们想要的方式将它们组合在一起 - 在这种情况下使用rbind
:< / p>
do.call("rbind", tapply(mat, row(mat), rev))
6)乘以反向对角矩阵由于rev
是线性算子,因此可以用矩阵表示:
mat %*% apply(diag(3), 1, rev)
或
mat %*% (row(mat) + col(mat) == 3+1)
答案 1 :(得分:2)
如果您查看apply()
的帮助,这正是您期望的行为:
值
如果每次调用FUN都返回一个长度为n的向量,则apply返回 如果n> 1,则为维数c(n,dim(X)[MARGIN])的数组。 1。
做你想做的事情的一个不错的选择是使用索引:
mat[,ncol(mat):1]