Как отобразить средние результаты вменения из тренировочного набора в тестовый набор? - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть вектор:

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 и подобными библиотеками, но я пытаюсь собственная функция.

1 Ответ

1 голос
/ 02 февраля 2020

Надеюсь, это даст вам то, что вы хотите. Я создам пример фрейма данных.

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

Теперь, если вы хотите , убедитесь, что каждый элемент вектора соответствует каждому элементу фрейма данных, так что первый элемент вектора соответствует первому столбцу фрейма данных. , тогда вы знаете, что столбцы имеют номера c, поэтому 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   

Однако, если вы хотите рассчитать средние значения столбцов цифры c в ваших данных, сделайте следующее:

# 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...