繁体   English   中英

向量化嵌套循环

[英]Vectorizing nested-loop

在过去的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 ,我将不胜感激。 但是,如果有更好的方法,我也想知道。

我们使用colMeans来获取'm1'列的mean ,使用col(m1)复制它,检查'm1'是否大于那些值以获得逻辑矩阵,并使用该值提取'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

暂无
暂无

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

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