【问题标题】:Imputation with column medians in R用 R 中的列中位数进行插补
【发布时间】:2017-02-13 05:42:56
【问题描述】:

如果我有一个向量,例如

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 但我无法根据我的情况调整任何解决方案。

【问题讨论】:

    标签: r matrix apply


    【解决方案1】:

    zoo 中有一个方便的函数 (na.aggregate) 可以用指定的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)
    

    【讨论】:

    • 可以缩短为:na.aggregate(mat, FUN = median)
    • @G.Grothendieck 我认为你是对的。我可能测试错了。
    【解决方案2】:

    在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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2019-02-22
      • 2012-10-18
      • 2018-04-29
      • 1970-01-01
      • 2021-06-04
      • 2014-06-08
      相关资源
      最近更新 更多