【问题标题】:How to programmatically replace NA values in a dataframe with values in a list?如何以编程方式将数据框中的 NA 值替换为列表中的值?
【发布时间】:2018-07-06 20:10:31
【问题描述】:

背景

我正在尝试使用 library(mvnmle)(具有缺失值的多元正态数据的 ML 估计)来估算缺失值。以下是使用库中随附的数据框 apple 的示例:

data(apple)
mlest(apple)

$`muhat`
[1] 14.72227 49.33325

$sigmahat
          [,1]      [,2]
[1,]  89.53415 -90.69653
[2,] -90.69653 114.69470

$value
[1] 148.435

$gradient
[1]  4.988478e-06  2.892682e-06  8.726424e-07  1.682947e-05 -1.073488e-04

$stop.code
[1] 1

$iterations
[1] 34

问题

apple 数据框中的worms 列中的缺失值很少。 mlest 列表为 muhat 提供数据框中两列的平均值。我想用muhat 值替换worm 列中的所有缺失值。在不同的数据框中,可以有多个缺少值的列。我想以编程方式将所有NA 值替换为muhat 中的对应值。
在此示例中,我可以通过以下方式手动执行此操作:

apple[is.na(apple2)] <- res$muhat[2]

如何实现自动化?

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以使用tidyverse 包吗?如果是这样,我认为这解决了您的问题并且是可扩展的。

    library(purrr)
    res <- mlest(apple)
    
    map2_df(apple,
            seq_along(apple),
            function(column, col_ind, mu_vec){
              if_else(is.na(column), mu_vec[col_ind], column)
            },
            res$muhat)
    

    【讨论】:

      【解决方案2】:

      使用 tidyverse: 首先确保根据列名命名方法:

      (mu=setNames(mlest(apple)$muhat,names(apple)))
          size    worms 
      14.72227 49.33325 
      

      现在使用replace_na 将所有列替换为特定均值:

       library(tidyverse)
       apple%>%replace_na(as.list(mu))
      

      在base R中,你可以使用sweep:

       sweep(apple,2,mlest(apple)$muhat,function(x,y)replace(x,is.na(x),y[is.na(x)]))
      

      【讨论】:

        【解决方案3】:

        如果我正确理解了您的问题和数据,这应该可以。

        apple$worms <- ifelse(is.na(apple$worms),res$muhat,apple$worms)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-03-06
          • 2021-08-30
          • 1970-01-01
          • 1970-01-01
          • 2021-07-08
          • 2019-04-03
          • 1970-01-01
          相关资源
          最近更新 更多