[英]r replacing values inferior to the mean of each column in a matrix
我有一個巨大的matrix
,我想在其中用NA
替換低於每列均值(或中值)的值。 例如,使用這個matrix
:
set.seed(1)
ex <- matrix(data = round(runif(12), 1), nrow = 4, ncol = 3)
ex
[,1] [,2] [,3]
[1,] 0.3 0.2 0.6
[2,] 0.4 0.9 0.1
[3,] 0.6 0.9 0.2
[4,] 0.9 0.7 0.2
我想得到:
for(i in 1:ncol(ex)){
ex[, i][ex[, i] < colMeans(ex)[i]] <- NA
}
ex
[,1] [,2] [,3]
[1,] NA NA 0.6
[2,] NA 0.9 NA
[3,] 0.6 0.9 NA
[4,] 0.9 0.7 NA
上面的代碼使用 for 循環,我想要一個更快的矢量化版本。
該解決方案與建議@Ronak Shah和@ThomasIsCoding比較microbenchmark
上一個更大的matrix
提供了以下結果:
# Generate matrix
set.seed(1)
ex <- matrix(data = round(runif(100000), 1), nrow = 1000, ncol = 100)
ex
colMeans(ex)
# for-loop solution
ex2 <- ex
for(i in 1:ncol(ex2)){
ex2[, i][ex2[, i] < colMeans(ex2)[i]] <- NA
}
ex2
# Solution with sweep
ex3 <- ex
ex3[sweep(ex3, 2, colMeans(ex3), "<")] <- NA
ex3
# Solution with replace
ex4 <- ex
ex4 <- replace(ex4, ex4 < t(replicate(nrow(ex4), colMeans(ex4))), NA)
ex4
# Transposing solution
ex5 <- ex
ex5[t(t(ex5) < colMeans(ex5))] <- NA
ex5
# Apply solution
ex6 <- ex
apply(ex6, 2, function(x) replace(x, x < mean(x), NA))
ex6
# Identical
all.equal(ex2, ex3, ex4, ex5, ex6)
# Microbenchmark
library(microbenchmark)
comp <- microbenchmark(
for_loop = {
ex2 <- ex
for(i in 1:ncol(ex2)){
ex2[, i][ex2[, i] < colMeans(ex2)[i]] <- NA
}},
sweep = {
ex3 <- ex
ex3[sweep(ex3, 2, colMeans(ex3), "<")] <- NA
},
replace = {
ex4 <- ex
ex4 <- replace(ex4, ex4 < t(replicate(nrow(ex4), colMeans(ex4))), NA)
},
transpose = {
ex5 <- ex
ex5[t(t(ex5) < colMeans(ex5))] <- NA
},
apply = {
ex6 <- ex
apply(ex6, 2, function(x) replace(x, x < mean(x), NA))
}
)
library(ggplot2)
autoplot(comp)
它們給出相同的結果,但sweep
方法似乎是最快的。
我們可以使用sweep
。
ex[sweep(ex, 2, colMeans(ex), `<`)] <- NA
ex
# [,1] [,2] [,3]
#[1,] NA NA 0.6
#[2,] NA 0.9 NA
#[3,] 0.6 0.9 NA
#[4,] 0.9 0.7 NA
或者有一些移調
ex[t(t(ex) < colMeans(ex))] <- NA
由於它是一個矩陣,我們也可以使用apply
columnwise
apply(ex, 2, function(x) replace(x, x < mean(x), NA))
這是另一個基本的 R 解決方案
ex <- replace(ex, ex < t(replicate(nrow(ex),colMeans(ex))),NA)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.