[英]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.