如何以编程方式将数据框中的NA值替换为列表中的值?

时间:2018-07-06 20:10:32

标签: r

背景

我正在尝试使用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

问题

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

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

我该如何自动化?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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

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

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

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

在基数R中,您可以使用sweep

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

答案 2 :(得分:0)

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

apple$worms <- ifelse(is.na(apple$worms),res$muhat,apple$worms)
相关问题