【问题标题】:Replace missing values with mean for subsets of dataframe用数据框子集的平均值替换缺失值
【发布时间】:2019-09-17 11:14:00
【问题描述】:

我有一个名为 final_project_data 的数据框,其结构如下。它包括 17 列,其中包含对应于县/州和年份的数据。例如,2006 年阿拉巴马州鲍德温县的人口为 69162 人,失业率为 4.2% 等。

ID          County       State       Population   Year    Ump.Rate Fertility  
<dbl>       <chr>        <chr>       <dbl>        <dbl>   <dbl>    <dbl>
1003    Baldwin County   Alabama     69162        2006     4.2     88
1015    Calhoun County   Alabama     112903       2006     2.4     na
1043    Baldwin County   Alabama     na           2007     1.9     71
1049    Calhoun County   Alabama     68014        2007     na      90
1050    CountyY          Alaska      2757         2006     3.9     na
1070    CountyZ          Alaska      11000        2006     7.8     95
1081    CountyY          Alaska      na           2007     6.5     70
1082    CountyZ          Alaska      67514        2007     4.5     60

其中有许多列缺少值,我试图用给定州和年份的平均值替换它们。我遇到了问题,试图循环遍历具有缺失值的每一列,然后遍历年份和行的每个子集以用平均值填充缺失值。我到目前为止的代码如下:

#get list of unique states
states <- unique(final_project_data$State)
#get list of columns with na in them - we will use this to impute missing 
values
list_na <- colnames(final_project_data)[ apply(final_project_data, 2, anyNA) ]

list_na
#create a place to hold the missing values
average_missing <- c()

#Loop through each state to impute the missing values with the mean
for(i in 1:length(states)){
 average_missing <- apply(final_project_data[which(final_project_data$State == states[i]),colnames(final_project_data) %in% list_na], 2, mean, na.rm =  TRUE) 
 }
average_missing

但是,当我运行上述代码时,我只为每个缺少值的列获取一组值,而不是为每个状态获取不同的值。我也不确定如何将其扩展到包括年份。任何帮助或建议将不胜感激!

【问题讨论】:

  • 您是说您需要将 NA 替换为年份和州的平均值。我不明白。我们甚至如何计算年份和州的平均值。这些不是数字。
  • 你说得对,对不起,我的问题不清楚。 ump.Rate、生育率等列中包含 na 值。我想用县所属的州和年份的平均值替换那些 na。例如,阿拉巴马州的卡尔霍恩县缺少 2007 年的 ump.rate。我想用平均 ump 替换 na。 2007 年在阿拉巴马州的评分。我已经编辑了我的问题,并为错误的措辞道歉。

标签: r


【解决方案1】:

在for循环中:

dt <- data.frame(
  ID = c(1003, 1015, 1043, 1049, 1050, 1070, 1081, 1082, NA, NA),
  State = c(rep("Alabama", 4), rep("Alaska", 4), "Alabama", "Alaska"),
  Population = c(sample(10000:100000, 8, replace = T), NA, NA),
  Year = c(2006, 2006, 2007, 2007, 2006, 2006, 2007, 2007, 2007, 2006),
  Unemployment = c(sample(1:5, 8, replace = T), NA, NA)
)

# index through each row in data frame
for (i in 1:nrow(dt)){

# if Population variable is NA
  if(is.na(dt$Population[i]) == T){ 

# calculate mean from all Population variables with the same State and Year as index
    dt$Population[i] <- mean(dt$Population[which(dt$State == dt$State[i] & dt$Year == dt$Year[i])], na.rm = T)
  }

# repeat for Unemployment variable
  if(is.na(dt$Unemployment[i]) == T){ 
    dt$Unemployment[i] <- mean(dt$Unemployment[which(dt$State == dt$State[i] & dt$Year == dt$Year[i])], na.rm = T)
  }
}

【讨论】:

    【解决方案2】:

    这是一个没有循环的dplyr 版本。只需在vars() 中添加您要转换的所有列:

    your_data %>%
      group_by(State, Year) %>%
      mutate_at(vars(Population, Ump.Rate, Fertility),
                ~ ifelse(is.na(.), mean(., na.rm = TRUE), .))
    

    【讨论】:

      猜你喜欢
      • 2018-02-05
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多