【问题标题】:how to use apply instead of a loop in R如何在 R 中使用应用而不是循环
【发布时间】:2016-02-10 10:04:38
【问题描述】:

我正在尝试编写一个计算量非常大的算法,因此我想用一个 apply 函数替换每个循环。但是,我在下面的循环中很累,我想知道是否有人有任何想法。 bc 是一个由 0 和 1 组成的矩阵,ac 是一个由 0 组成的矩阵,与 bc 具有相同的暗度。

for (i in 1:nr){                               
  for (j in 1:nr){
    ac[i,j] <- (bc[i,j]+bc[j,i])/2          
  }
}

【问题讨论】:

  • NB 下面的答案更好、更快、更简洁,因为它是矢量化apply 之类的函数只是语法糖——更简单、更清晰——但并不比循环更有效或更快。

标签: r apply sapply tapply mapply


【解决方案1】:

我们可以得到bc的总和和bc的转置并除以2。

(bc+t(bc))/2

或者

Reduce(`+`, list(bc, t(bc)))/2

数据

bc <- matrix(1:25, 5,5)
nr <- 5
ac <- matrix(,5,5)

【讨论】:

  • 不确定Reduce 解决方案会带来什么……毕竟,没有人会把a + b 写成Reduce('+', list(a, b))。然而这是一样的。
  • @KonradRudolph 如果数据集很多,多次使用+ 会很困难,所以我认为Reduce 很有用。
  • @Akis 我是从 stackoverflow 和 R 邮件列表中天才的帖子中了解到这些方法的(包括在此处发表评论的人)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 2019-05-10
  • 2020-11-20
相关资源
最近更新 更多