Заменить пропущенные значения средним для подмножеств данных - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть фрейм данных с именем 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

Однако, когда я запускаю приведенный выше фрагмент кода, я получаю только один набор значений для каждого из столбцов с пропущенными значениями, а не для другого значениядля каждого государства.Я также не уверен, как расширить это, чтобы включить годы.Буду признателен за любую помощь или совет!

Ответы [ 2 ]

0 голосов
/ 28 апреля 2019

Вот версия dplyr без цикла.Просто добавьте все столбцы, которые вы хотите преобразовать, изолированные vars():

your_data %>%
  group_by(State, Year) %>%
  mutate_at(vars(Population, Ump.Rate, Fertility),
            ~ ifelse(is.na(.), mean(., na.rm = TRUE), .))
0 голосов
/ 28 апреля 2019

В цикле:

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)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...