0

我有一个向量:

mean_imputed_values_trainining_set <- c(0.5247570, 0.4077914,0.1393320,0.8233340, 0.3610365,0.1805526, 0.2375011, 9.8848462 )      

我尝试创建一个自定义函数,其中向量的结果将估算 NA 值。向量的第一个元素对应于数据框的第一列。这是自定义函数:

NA_imputer_test <- function(train, test) {

  map_df(train, function(x) {

    map_df(test, function(element) {

      if(is.numeric(element)) {
        ifelse(is.na(element), mean(x, na.rm = TRUE), element) 
      } else { 
        element 
      }
    })
  }) 


}  

test_set <- NA_imputer_test(train, test)

但是,当我尝试使用自定义函数时,我无法使用向量的结果。相反,只有 0.5247570 值会估算所有缺失值。

如何确保向量的每个元素与数据框的每个元素对应?

我知道有 MICE 和类似库的解决方案,但我正在尝试制作自己的功能。

4

1 回答 1

1

希望这应该给你你想要的。我将创建一个示例数据框。

df <- data.frame(matrix(data = sample(100,80,replace=TRUE), ncol = 8))
df[df>80] <- NA_integer_

> df

   X1 X2 X3 X4 X5 X6 X7 X8
1  80 14 NA 78 39 60 14 25
2  75 46  4 47 61 74 36 NA
3  67  2  2 NA 42 NA NA NA
4   8 34 15  9 NA 79 62  9
5  NA 34 10 NA NA  5 42 NA
6  NA 75 17  3  8 45 72 45
7  71 64 NA NA NA 77 20 63
8  25 NA 24 58 NA NA 47 NA
9  80 71 NA  3 71 22 NA 64
10 43 43 NA NA 54 73 55 77

现在,如果您想确保向量的每个元素与数据框的每个元素对应,以便向量的第一个元素对应于数据框的第一列。,那么您知道这些列是数字的,因此if(is.numeric(element))可能不需要。你可以purrr::map这样使用:

> map2_dfr(df, mean_imputed_values_trainining_set,
+          ~ replace(.x, is.na(.x), .y))

# A tibble: 10 x 8
       X1     X2     X3     X4     X5     X6     X7    X8
    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl> <dbl>
 1 80     14      0.139 78     39     60     14     25   
 2 75     46      4     47     61     74     36      9.88
 3 67      2      2      0.823 42      0.181  0.238  9.88
 4  8     34     15      9      0.361 79     62      9   
 5  0.525 34     10      0.823  0.361  5     42      9.88
 6  0.525 75     17      3      8     45     72     45   
 7 71     64      0.139  0.823  0.361 77     20     63   
 8 25      0.408 24     58      0.361  0.181 47      9.88
 9 80     71      0.139  3     71     22      0.238 64   
10 43     43      0.139  0.823 54     73     55     77   

但是,如果您想用数据中数字列的平均值进行估算,请执行以下操作:

# Adding a non-numeric column 
> df[,'X9'] <- sample(letters, 10, replace=T)


> map_if(df, is.numeric, 
+        function(x) replace(x, is.na(x), mean(x, na.rm=T)), 
+        .else = function(x) x)%>%bind_cols()

# A tibble: 10 x 9
      X1    X2    X3    X4    X5    X6    X7    X8 X9   
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
 1  80    14      12    78  39    60    14    25   d    
 2  75    46       4    47  61    74    36    47.2 w    
 3  67     2       2    33  42    54.4  43.5  47.2 n    
 4   8    34      15     9  45.8  79    62     9   r    
 5  56.1  34      10    33  45.8   5    42    47.2 g    
 6  56.1  75      17     3   8    45    72    45   y    
 7  71    64      12    33  45.8  77    20    63   t    
 8  25    42.6    24    58  45.8  54.4  47    47.2 d    
 9  80    71      12     3  71    22    43.5  64   d    
10  43    43      12    33  54    73    55    77   m    

您可以将其包装在一个函数中:

NA_imputer_test <- function(data){
  out_df = map_if(data, is.numeric, 
                  function(x) replace(x, is.na(x), mean(x, na.rm=T)), 
                  .else = function(x) x)%>%bind_cols()
  return(out_df)
}
于 2020-02-02T06:55:12.993 回答