我正在尝试将矩阵的每列中的NA替换为该列的中位数,但是当我尝试使用或
lapply
时,我收到错误;当我使用for循环时,代码工作,当我一次更改一列时,我做错了什么?
示例:
sapply
答案 0 :(得分:7)
我建议使用matrixStats
包进行矢量化,而不是使用任何一个循环计算每列的中位数(sapply
在某种意义上也是一个循环,它在每次迭代中计算一个函数) 。
首先,我们将创建一个NA
s索引
indx <- which(is.na(mat), arr.ind = TRUE)
然后,使用预先计算的列中值并根据索引替换NA
mat[indx] <- matrixStats::colMedians(mat, na.rm = TRUE)[indx[, 2]]
答案 1 :(得分:2)
您可以使用sweep
:
sweep(mat, MARGIN = 2,
STATS = apply(mat, 2, median, na.rm=TRUE),
FUN = function(x,s) ifelse(is.na(x), s, x)
)
编辑:
您也可以放入STATS=matrixStats::colMedians(mat, na.rm=TRUE)
以获得更高的性能。
答案 2 :(得分:1)
lapply
遍历列表。你的意思是循环列吗?
matx <- sapply(seq_len(ncol(mat1)), function(n) {
mat1[is.na(mat1[,n]),n] <- median(mat1[,n], na.rm = TRUE)
})
虽然这基本上只是做你的循环示例所做的(但可能更快)。
答案 3 :(得分:0)
使用data.frame
,您可以通过转换为matrix
并返回vapply
来更轻松地实现目标:
vapply(as.data.frame(mat1), function(x)
replace(x, is.na(x), median(x,na.rm=TRUE)), FUN.VALUE=numeric(nrow(mat1))
)