如何将训练集的平均插补结果映射到测试集?
How to map the mean imputation results from a training set to a test set?
我有一个向量:
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 和类似库的解决方案,但我正在尝试实现自己的功能。
希望这能满足您的需求。我将创建一个示例数据框。
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)
}
我有一个向量:
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 和类似库的解决方案,但我正在尝试实现自己的功能。
希望这能满足您的需求。我将创建一个示例数据框。
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)
}