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

时间:2017-03-24 17:18:28

标签: 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

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

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的行为中。任何人都可以向我解释这个吗?

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

  

docs

2 个答案:

答案 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]