【问题标题】:How to map the mean imputation results from a training set to a test set?如何将训练集的平均插补结果映射到测试集?
【发布时间】:2020-05-18 02:22:04
【问题描述】:

我有一个向量:

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 和类似库的解决方案,但我正在尝试制作自己的功能。

【问题讨论】:

  • 您希望traintest 对象看起来像什么?
  • 请使用dput(head(train))向我们展示您的数据结构。
  • 感谢大家的反馈。我很抱歉没有遵循最佳做法,但是,我以后会这样做的。

标签: r dataframe dplyr tidyverse data-wrangling


【解决方案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)
}

【讨论】:

  • 谢谢凯,这太棒了。将来,我肯定会使用更多的替换。
猜你喜欢
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 2013-03-04
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
相关资源
最近更新 更多