在过去的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
,我会很感激。但是如果有更好的方法我也想知道它们。
答案 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