R中应用/反向函数的奇怪行为

Pra*_*190 1 r matrix apply

我有一个简单的矩阵:

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
Run Code Online (Sandbox Code Playgroud)

我想现在逐行反转矩阵.那是我想获得的:

revMat
#      [,1] [,2] [,3]
# [1,]    3    2    1
# [2,]    6    5    4
# [3,]    9    8    7
Run Code Online (Sandbox Code Playgroud)

为此,我试过了

 apply(mat, 1, rev)
Run Code Online (Sandbox Code Playgroud)

结果是:

#      [,1] [,2] [,3]
# [1,]    3    6    9
# [2,]    2    5    8
# [3,]    1    4    7
Run Code Online (Sandbox Code Playgroud)

我觉得这很奇怪.这就像行被反转,然后最终矩阵被转置.我不明白为什么.例如,如果我简单地尝试,

apply(mat, 2, rev)
Run Code Online (Sandbox Code Playgroud)

它给了我每列的预期逆转

#      [,1] [,2] [,3]
# [1,]    7    8    9
# [2,]    4    5    6
# [3,]    1    2    3
Run Code Online (Sandbox Code Playgroud)

因此,要获得最终结果,我必须执行

t(apply(t(bg), 2, rev))
Run Code Online (Sandbox Code Playgroud)

因此,获得所需的矩阵对我来说不是问题,但我不理解apply/reverse行为中的"异常".任何人都可以向我解释这个吗?

编辑:为了明确区分,我已经知道如何进行逆转.我想知道为什么会这样.如何从许多早期的问题中清楚地看到,包括

如何反转R中的矩阵?

G. *_*eck 7

apply始终将结果放在第一维中.有关?apply更多信息,请参阅 假设这个输入:

mat <- matrix(1:9, 3, byrow = TRUE)
Run Code Online (Sandbox Code Playgroud)

这里有一些替代方案:

1)转置

t(apply(mat, 1, rev))
Run Code Online (Sandbox Code Playgroud)

2)避免使用索引

mat[, 3:1]
Run Code Online (Sandbox Code Playgroud)

3)iapply 在这里发布了幂等申请:https: //stat.ethz.ch/pipermail/r-help/2006-January/086064.html 使用我们:

iapply(mat, 1, rev)
Run Code Online (Sandbox Code Playgroud)

还有一个幂等的应用,iapply在版本0.8.0的reshape包中(但不是最新版本的reshape):https: //cran.r-project.org/src/contrib/Archive/reshape/

4) rollapply可以使用动物园包中的rollapply:

library(zoo)

rollapply(mat, 1, rev, by.column = FALSE)
Run Code Online (Sandbox Code Playgroud)

5)tapplytapply这里 的表达式返回一个列表,让我们有机会以我们想要的方式将它组合在一起 - 在这种情况下使用rbind:

do.call("rbind", tapply(mat, row(mat), rev))
Run Code Online (Sandbox Code Playgroud)

6)乘以反向对角矩阵 由于rev是线性算子,它可以用矩阵表示:

mat %*% apply(diag(3), 1, rev)
Run Code Online (Sandbox Code Playgroud)

要么

mat %*% (row(mat) + col(mat) == 3+1)
Run Code Online (Sandbox Code Playgroud)