【问题标题】:How to finish code to replace NA with median in R如何完成在R中用中位数替换NA的代码
【发布时间】:2017-07-13 11:46:41
【问题描述】:

我对 R 很陌生,所以请温柔一点。

我正在参加 Kaggle Titanic 比赛,让我进入 R 并解决问题。

我正在设计一个功能,但我对下一步该做什么的逻辑有点卡住了。

所以,就这样吧。我的目标是获取年龄数据并将所有 NA 替换为该人头衔的年龄中位数。例如如果此人是大师,我想获得所有大师的中位数,并用该中位数替换 NA。先生等也一样。

我已经设法为自己创建了一个包含标题和年龄的 data.frame,如下所示:

library(tibble)
data.combined <-
  tibble(
    data.combined.new.title = c(
      "Mr.",
      "Mrs.",
      "Miss",
      "Mrs.",
      "Mr.",
      "Mr.",
      "Mr.",
      "Master",
      "Mrs."
    ),
    data.combined.Age = c(22, 38, 26, 35, 35, NA, 54, 2, 27)
  )

正如您在此列表中看到的,在他的年龄旁边有一个先生和 NA。我想用列表中所有其他先生的中位数替换那个 NA。

所以我有以下代码,可以用整个数据集的中位数替换 NA。

#Creates my data.frame
agedata <- data.frame(data.combined$new.title, data.combined$Age)

#replace NA with the mean of the whole data set
agedata$data.combined.Age[is.na(agedata$data.combined.Age)] <- median(agedata$data.combined.Age, na.rm = TRUE)

我只是不明白如何在此代码中添加以将 NA 替换为头衔组的中位数,先生,大师,夫人,小姐?

任何指针都大大收到。

我不太关心这是否有助于我对 Kaggle 的预测,更多的是代码的外观。

非常感谢。

【问题讨论】:

  • 我想最简单的是na.aggregate 即。 library(zoo);df1 %&gt;% group_by(group) %&gt;% mutate(traits = na.aggregate(traits, FUN = median))

标签: r replace na median kaggle


【解决方案1】:

或者这个tidyverse one-liner

agedata %>% group_by(title) %>% mutate(age=ifelse(is.na(age), median(age, na.rm=TRUE), age))

【讨论】:

    【解决方案2】:
    zz <- "group traits
    BSPy01-10     NA
    BSPy01-10    7.3
    BSPy01-10    7.3
    BSPy01-11    5.3
    BSPy01-11    5.4
    BSPy01-11    5.6
    BSPy01-11     NA
    BSPy01-11     NA
    BSPy01-11    4.8
    BSPy01-12    8.1
    BSPy01-12    6.0
    BSPy01-12    6.0
    BSPy01-13    6.1"
    Data <- read.table(text=zz, header = TRUE)
    
    impute <- function(x, fun) {
    missing <- is.na(x)
    replace(x, missing, fun(x[!missing]))
    }
    ddply(Data, ~ group, transform, traits = impute(traits, median))
    

    【讨论】:

      【解决方案3】:

      这可能不是最优雅的方式,但它确实有效:

      title <- c("Mr", "Mrs", "Miss", "Mrs", "Mr", "Mr", "Mr", "Master", "Mrs")
      age <- c(22, 38, 26, 35, 35, NA, 54, 2, 27)
      df = data.frame(title, age)
      
      # get the medians by groups
      medians = aggregate(df$age, list(df$title), median, na.rm = TRUE)
      # match the missing ages with the medians thanks to the groups
      df$age[is.na(df$age)] <- medians[array(medians$Group.1) == df$title[is.na(df$age)], "x"]
      

      【讨论】:

        【解决方案4】:

        library(data.table)

        dt <- data.table(title = c("Mr", "Mrs", "Miss", "Mrs", "Mr", "Mr", "Mr", "Master", "Mrs"),
        age = c(22, 38, 26, 35, 35, NA, 54, 2, 27))
        
        dt[,avg_age:=median(age,na.rm=T),by="title"]
        dt[is.na(age),age:=avg_age]
        dt[,avg_age:=NULL]
        

        【讨论】:

          猜你喜欢
          • 2016-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-17
          • 2011-12-31
          • 1970-01-01
          相关资源
          最近更新 更多