gpt4 book ai didi

r - R 中应用/反转函数的奇怪行为

转载 作者:行者123 更新时间:2023-12-05 08:33:12 26 4
gpt4 key购买 nike

我有一个简单的矩阵:

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))

因此获得所需的矩阵对我来说不是问题,但我不理解应用/反向行为中的“异常”。谁能给我解释一下?

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

How to reverse a matrix in R?

最佳答案

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)

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

4)rollapply 可以使用zoo包中的rollapply:

library(zoo)

rollapply(mat, 1, rev, by.column = FALSE)

5) tapply 这里的 tapply 表达式返回一个列表,让我们有机会以我们想要的方式将它放在一起——在本例中使用 rbind :

do.call("rbind", tapply(mat, row(mat), rev))

6) 乘以反向对角矩阵 因为rev 是一个线性运算符,它可以用矩阵表示:

mat %*% apply(diag(3), 1, rev)

mat %*% (row(mat) + col(mat) == 3+1)

关于r - R 中应用/反转函数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43005502/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com