希望这应该给你你想要的。我将创建一个示例数据框。
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)
}