繁体   English   中英

如何在R中向量化此代码

[英]How to vectorize this code in R

从...开始:

m <- matrix(c(12,9,8,31), nrow=2)
(m.obs <- m.exp <- addmargins(m, FUN=sum, quiet=T))

我有以下代码:

m.exp[1,1] <- m.obs[1,3] / m.obs[3,3] * m.obs[3,1]
m.exp[1,2] <- m.obs[1,3] / m.obs[3,3] * m.obs[3,2]
m.exp[2,1] <- m.obs[2,3] / m.obs[3,3] * m.obs[3,1]
m.exp[2,2] <- m.obs[2,3] / m.obs[3,3] * m.obs[3,2]

这可以写成嵌套循环,如下所示:

for (row in 1:2) {
  for (column in 1:2) {
    m.exp[row,column] <- m.obs[row,3] / m.obs[3,3] * m.obs[3,column]
  }
}

我的问题是这是否也可以用矢量化形式编写。 是否可以通过不同的方式对这段代码进行矢量化? 或者还有其他方法可以简化它吗?

我的目标是找到不同的可能性,说明如何在R中使代码更快和/或更优雅。这个想法当然是要有比这个玩具示例大得多的矩阵。

该示例的背景是从卡方检验的观察频率计算预期频率的矩阵。

尝试这个

(m.obs[-3, 3]/ m.obs[3,3]) %*% t(m.obs[3, -3])

您可以通过将其编写为避免循环

m.exp[1:2, 1:2] <- m.obs[rep(1:2, 2), 3] *
    m.obs[3, rep(1:2, each = 2)] / m.obs[3,3]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM