矢量化嵌套循环

时间:2015-10-28 13:23:48

标签: r loops vectorization

在过去的3个小时里,我试图对某些代码进行矢量化。我们的想法是循环一个矩阵,并将所有值与列上的平均值进行比较。如果值较大,请将它们设置为999。

comparevalues <- function(y){
  x <- apply(y,2, function(y) mean(y,na.rm=T))    
  for (j in 1:ncol(y)){
    for (i in 1:nrow(y)){
      if (!is.na(y[i,j]) & y[i,j] > x[j]) y[i,j] <- 999
    }
  }
  return(y)
}

测试,例如用:

m1 <- matrix(c(1:3,NA,2.4,2.8,3.9,0,1,3,0,2,1.3,2,NA,7,3.9,2.4),6,3)
comparevalues(m1)

结果:

      [,1] [,2]  [,3]
[1,]    1  999   1.3
[2,]    2    0   2.0
[3,]  999    1    NA
[4,]   NA  999 999.0
[5,]  999    0 999.0
[6,]  999  999   2.4

我的问题是:

1)这种结构可以被矢量化,如果是这样,它怎么做?

2)我正在尝试在此上下文中使用apply和类似函数。可能有不同的方法来解决这个问题,但出于学习目的,如果有人能够解决apply,我会很感激。但是如果有更好的方法我也想知道它们。

1 个答案:

答案 0 :(得分:1)

我们使用colMeans获取&#39; m1&#39;列的mean,使用col(m1)进行复制,检查&#39; m1&# 39;为了获得逻辑矩阵,大于这些值,提取“m1”的元素。使用它并将其分配给999。

m1[m1 >colMeans(m1, na.rm=TRUE)[col(m1)]] <- 999
m1
#     [,1] [,2]  [,3]
#[1,]    1  999   1.3
#[2,]    2    0   2.0
#[3,]  999    1    NA
#[4,]   NA  999 999.0
#[5,]  999    0 999.0
#[6,]  999  999   2.4