Jon*_*rne 4 r matrix median na imputation
我试图将矩阵的每列中的NA替换为该列的中值,但是当我尝试使用lapply或者sapply我得到错误时; 当我使用for循环时,代码工作,当我一次更改一列时,我做错了什么?
例:
set.seed(1928)
mat <- matrix(rnorm(100*110), ncol = 110)
mat[sample(1:length(mat), 700, replace = FALSE)] <- NA
mat1 <- mat2 <- mat
mat1 <- lapply(mat1,
function(n) {
mat1[is.na(mat1[,n]),n] <- median(mat1[,n], na.rm = TRUE)
}
)
for (n in 1:ncol(mat2)) {
mat2[is.na(mat2[,n]),n] <- median(mat2[,n], na.rm = TRUE)
}
Run Code Online (Sandbox Code Playgroud)
我建议使用matrixStats包进行矢量化,而不是使用任何sapply一个循环计算每列的中位数(在某种意义上它也是一个循环,它在每次迭代中计算一个函数).
首先,我们将创建一个NAs索引
indx <- which(is.na(mat), arr.ind = TRUE)
Run Code Online (Sandbox Code Playgroud)
然后,NA使用预先计算的列中值并根据索引替换s
mat[indx] <- matrixStats::colMedians(mat, na.rm = TRUE)[indx[, 2]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1714 次 |
| 最近记录: |