用该列的中值替换每列矩阵中的NA

时间:2016-01-18 23:08:39

标签: r matrix na median imputation

我正在尝试将矩阵的每列中的NA替换为该列的中位数,但是当我尝试使用lapply时,我收到错误;当我使用for循环时,代码工作,当我一次更改一列时,我做错了什么?

示例:

sapply

4 个答案:

答案 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)) 
)