Заменить NA сгруппированными средствами в R? - PullRequest
0 голосов
/ 17 октября 2018

Я застрял при попытке заменить NA средними значениями, и я был бы очень признателен за помощь.

Я хочу заменить NA в нескольких столбцах кадра данных средним значением группы в столбце.В приведенном ниже примере я хотел бы заменить NA в x1 на 14,5, поскольку 13 и 16 в месяце 1. NA в x2 следует заменить на 4,5.

Вот как я это пробовал:

library(tidyverse)

df <- tibble(x1 = c(13, NA, 16, 17, 16, 12), x2 = c(1, 4, 4, 3, 5, NA),
         month = c(1, 1, 1, 2, 2, 2))

by_month <- group_by(df, month)

for (i in length(df)){
   for (j in nrow(df[[,i]])){
     if(is.na(df[[j, i]])){
      df[[j, i]] <- summarize(by_month[[j, i]],
                                   group_mean = mean(df[[, i]], na.rm=TRUE))
    }
    else{
      df[[j, i]] <- df[[j, i]]
    }
  }
}

Однако я просто получаю сообщение об ошибке "Аргумент" ..1 "отсутствует, по умолчанию нет", который я исследовал - но это не помогло.Любая помощь была бы великолепна:)

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Вот базовое решение R с использованием ave и sapply -ing для каждого столбца x1 и x2.

df[1:2] <- sapply(df[1:2], function(x){
  ave(x, df[[3]], FUN = function(.x) {
    .x[is.na(.x)] <- mean(.x, na.rm = TRUE)
    .x
  })
})


df
## A tibble: 6 x 3
#     x1    x2 month
#  <dbl> <dbl> <dbl>
#1  13       1     1
#2  14.5     4     1
#3  16       4     1
#4  17       3     2
#5  16       5     2
#6  12       4     2
0 голосов
/ 17 октября 2018

Я немного изменил ваш пример, потому что у предоставленного вами фрейма данных были столбцы различной длины, но это должно решить вашу проблему:

Сначала я загрузил пакеты в tidyverse.Затем я сгруппировал данные по месяцам.Второй канал запускает функцию mutate_all, поэтому он автоматически меняет все столбцы.

library(tidyverse)

df <- tibble(x1 = c(13, NA, 16, 17, 16, 12), x2 = c(1, 4, 3, 5, NA, 4),
             month = c(1, 1, 1, 2, 2, 2))


new_df <- df %>%  group_by(month) %>%
  mutate_all(funs(ifelse(is.na(.), mean(., na.rm = TRUE),.)))

Дайте мне знать, если это поможет.

...