我试图用该列的中位数替换矩阵每一列中的 NA,但是当我尝试使用lapply
or sapply
我收到一个错误;当我使用 for 循环并且一次更改一列时,代码有效,我做错了什么?
Example:
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)
}
我建议使用向量化matrixStats
包而不是使用任一循环计算每列的中位数(sapply
从某种意义上说,它也是一个循环,它在每次迭代中评估一个函数)。
首先,我们将创建一个NA
s index
indx <- which(is.na(mat), arr.ind = TRUE)
然后,更换NA
s 使用预先计算的列中位数并根据索引
mat[indx] <- matrixStats::colMedians(mat, na.rm = TRUE)[indx[, 2]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)