【问题标题】:converting a for cycle in R在R中转换一个for循环
【发布时间】:2018-01-31 21:48:06
【问题描述】:

我想将 for 循环转换为更快的操作,例如 apply。

这是我的代码

for(a in 1:dim(k)[1]){

for(b in 1:dim(k)[2]){

if( (k[a,b,1,1]==0) & (k[a,b,1,2]==0) & (k[a,b,1,3]==0) ){

  k[a,b,1,1]<-1

  k[a,b,1,2]<-1

  k[a,b,1,3]<-1

      }
        }
          }

这是一个简单的代码,它检查多维数组 k 的每个元素,如果三个元素相同且等于 0,则赋值为 1。

有没有办法让它更快?矩阵 k 有 1,444,000 个元素,运行它需要很长时间。有人可以帮忙吗?

谢谢

【问题讨论】:

  • 请提供一个可重现的例子。
  • 我的k矩阵确实很大,但想象一下它可以定义如下k&lt;-array(c(1,1,1,0,2,2,2,0,3,3,3,0),dim=c(2,2,3))
  • 只需粘贴 dput(head(k)),或者,如果仍然太大,请缩小尺寸以包含 k[c(1,2), c(1,2), 1, c(1:3)]
  • &gt;k[c(1,2), c(1,2), 1, c(1:3)] , , 1 [,1] [,2] [1,] 0 0 [2,] 0 0 , , 2 [,1] [,2] [1,] 0 0 [2,] 0 0 , , 3 [,1] [,2] [1,] 0 0 [2,] 0 0 还有`cimg [1:800, 1:600, 1, 1:3] 0 0 0 0 0 0 0 0 0 0 ...`
  • 在提出新问题之前,您先接受以前问题的答案怎么样?

标签: r loops for-loop apply cycle


【解决方案1】:

使用 apply 您可以将所有 3 组合作为数字向量返回,然后检查您的具体情况:

    # This creates an array with the same properties as yours
    array <- array(data = sample(c(0, 1), 81, replace = TRUE, 
                         prob = c(0.9, 0.1)), c(3, 3, 3, 3))

    # This loops over all vectors in the fourth dimension and returns a
    # vector of ones if your condition is met
    apply(array, MARGIN = c(1, 2, 3), FUN = function(x) {
      if (sum(x) == 0 & length(unique(x)) == 1)
        return(c(1, 1, 1))
      else
        return(x)
    })

请注意,MARGIN 参数指定循环的维度。您需要第四维向量,因此您指定 c(1, 2, 3)

如果您随后将这个新创建的数组分配给旧数组,则将满足条件的所有向量替换为 1。

【讨论】:

  • 请注意,如果x 包含负值和正值,sum(x) == 0 可能是 TRUE
  • 是的,我刚刚添加了length(unique(x)) == 1。谢谢。
  • 发布的解决方案有效吗?如果是这样,请考虑通过单击复选标记来接受答案。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
【解决方案2】:

您应该首先使用过滤器函数两次(组合),然后对过滤后的数组使用应用(lapply?)函数。也许你也可以减少数组,因为看起来你对第三维不是很感兴趣(总是访问第一项)。您可能应该在http://adv-r.had.co.nz/Functionals.html 阅读有关 R 中的函数式编程的内容@

注意我不是 R 程序员,但我对函数式编程(Haskell 等)非常熟悉,所以这可能会给你一个想法。这可能会更快,但这在一定程度上取决于 R 的设计方式(惰性或急切评估等)。

【讨论】:

    猜你喜欢
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2021-02-25
    • 2022-10-17
    • 2016-01-26
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多