R:用分组表代替NA

  • 本文关键字:NA r dplyr imputation
  • 更新时间 :
  • 英文 :


我将把我的数据帧分割成一个训练和测试部分,用于训练机器学习算法。在这样做的过程中,我需要替换训练集的NA值,保留它们并稍后将它们应用于测试集。这是一种常用的方法,这样测试数据就不会影响训练。

关键的一点是,A具有属于特定组的数据,例如性别。因此,数据的输入必须以组为基础。下面是一个示例数据框架:

df <- dplyr::tibble(gender  = c(1, 2, 1, 1, 2), 
lab1 = c(NA, 2, 3, NA, NA),
lab2 = c(4, NA, NA, 2, 2))

下一步,我基于具有相同形状的其他数据(训练数据)计算了下表。这是输出:

gender col   imputed_with
<dbl> <chr>        <dbl>
1      1 lab1             3
2      2 lab1             2
3      1 lab2             3
4      2 lab2             2

我现在需要用这个表中的值替换第一个数据框中的缺失值,这个表基本上用作查找表,用训练数据计算。

如何做到这一点?或者更好的是,有没有什么官方的软件包可以方便整个归算过程?

要组合这两个表,需要一个合并连接,可以通过tidyr::pivot_longer()dplyr::rows_patch()实现:

library(tidyverse)
df <- tibble::tibble(
gender  = c(1, 2, 1, 1, 2), 
lab1 = c(NA, 2, 3, NA, NA),
lab2 = c(4, NA, NA, 2, 2)
)
to_impute <- tibble::tribble(
~gender, ~col, ~imputed_with,
1, "lab1", 3,
2, "lab1", 2,
1, "lab2", 3,
2, "lab2", 2
)
impute_wide <- pivot_wider(
to_impute, 
names_from = col, 
values_from = imputed_with
)
impute_wide
#> # A tibble: 2 × 3
#>   gender  lab1  lab2
#>    <dbl> <dbl> <dbl>
#> 1      1     3     3
#> 2      2     2     2
rows_patch(
df, 
impute_wide, 
by = colnames(to_impute)[!colnames(to_impute) %in% c("col", "imputed_with")]
)
#> # A tibble: 5 × 3
#>   gender  lab1  lab2
#>    <dbl> <dbl> <dbl>
#> 1      1     3     4
#> 2      2     2     2
#> 3      1     3     3
#> 4      1     3     2
#> 5      2     2     2

然而,有大量的R包处理imputation。

如果您熟悉tidymodels包,那么recipes::step_impute_()函数族可以用于估算,同时阻止数据从测试集泄漏到训练集。

在mice包中,mice::mice()有一个ignore参数,它允许您在拟合imputation模型时忽略数据集的测试部分。

我肯定还有其他我不知道的。

相关内容

  • 没有找到相关文章

最新更新