R

时间:2016-10-04 22:32:52

标签: r matrix apply

如果我有一个矢量,例如

vec <- c(3,4,5,NA)

我可以使用以下代码将NA替换为向量中其他值的中值:

vec[which(is.na(vec))] <- median(vec, na.rm = T)

但是,如果我有一个包含NA的矩阵,则在矩阵的所有列上应用相同的代码不会返回矩阵,只返回每个矩阵列的中位数。

mat <- matrix(c(1,NA,3,5,6,7,NA,3,4,NA,2,8), ncol = 3)
apply(mat, 2, function(x) x[which(is.na(x))] <- median(x, na.rm=T) )

#[1] 3 6 4

如何通过由列中位数替换的NA来恢复矩阵?这个问题很相似:Replace NA values by row means但我无法根据我的情况调整任何解决方案。

2 个答案:

答案 0 :(得分:3)

na.aggregate中有一个方便的功能(zoo),用指定的FUN替换NA元素。

library(zoo)
apply(mat, 2, FUN = function(x) na.aggregate(x, FUN = median))
#      [,1] [,2] [,3]
#[1,]    1    6    4
#[2,]    3    7    4
#[3,]    3    6    2
#[4,]    5    3    8

或者正如@ G.Grothendieck评论的那样,na.aggregate可以直接应用于matrix

na.aggregate(mat, FUN = median)

答案 1 :(得分:1)

在apply中添加return(x)作为函数的最后一行将解决它。

> apply(mat, 2, function(x){
    x[which(is.na(x))] <- median(x, na.rm=T)
    return(x)
  })
     [,1] [,2] [,3]
[1,]    1    6    4
[2,]    3    7    4
[3,]    3    6    2
[4,]    5    3    8