【问题标题】:Imputing multiple columns in R using mutate_at使用 mutate_at 在 R 中计算多列
【发布时间】:2020-03-31 07:24:03
【问题描述】:

我有一个大型医疗数据框,我想将其用于机器学习。因此,我必须估算缺失值。对于连续变量,我想输入中值,如下所示:

dat$First_Wbc <- ifelse(is.na(dat$First_Wbc), median2(dat$First_Wbc), dat$First_Wbc)

我想使用 mutate_at 创建一个与我上面提供的代码相同的代码,但一次用于多个变量。我知道这是可能的,但到目前为止我还无法正确格式化它。 你能帮帮我吗?

注意:median2() 是一个与 median() 相同的函数,但它忽略了缺失值

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    基础 R 解决方案:

    dat[,sapply(dat, is.numeric)] <- lapply(dat[,sapply(dat, is.numeric)], 
                                            function(x){
                                             x <- ifelse(is.na(x), median(x, na.rm  = TRUE), x)
                                              }
                                            )
    

    使用 mutate_if 的 Tidyverse:

    library(tidyverse)
    df %>% 
      mutate_if(is.numeric, funs(replace(., is.na(.), median(., na.rm = TRUE))))
    

    【讨论】:

      【解决方案2】:

      您可以按位置选择列:

      library(dplyr)
      df %>% mutate_at(2:4, ~replace(., is.na(.), median2(.)))
      

      或按列的范围

      df %>% mutate_at(vars(a:d), ~replace(., is.na(.), median2(.)))
      

      或者在列名中使用特定模式。

      df %>% mutate_at(vars(starts_with('col')), ~replace(., is.na(.), median2(.)))
      

      【讨论】:

        【解决方案3】:

        我们可以使用mutate_ifna.aggregate

        library(dplyr)
        library(zoo)
        df %>% 
           mutate_if(is.numeric, na.aggregate, FUN = median)
        

        【讨论】:

          【解决方案4】:

          说到整洁的解决方案,我真的很喜欢naniar 包,它提供了许多有用的方法来处理丢失的数据。

          例如,在这里您可以在所有数字列中估算中位数:

          library(tidyverse)
          library(naniar)
          
          df %>%
            impute_median_if(is.numeric)
          

          更多附加值来自impute_median_all()impute_mean_if() 和许多出色的缺失数据可视化。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-01-01
            • 1970-01-01
            • 2020-07-12
            • 2017-01-05
            • 2018-12-24
            相关资源
            最近更新 更多