Tengo un marco de datos "df" que contiene series temporales de lluvia

 str(df)
'data.frame':   10227 obs. of  6 variables:
 $ Date : Date, format: "1990-01-01" "1990-01-02" "1990-01-03" ...
 $ Month: Ord.factor w/ 12 levels "Jan"<"Feb"<"Mar"<..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Year : num  1990 1990 1990 1990 1990 1990 1990 1990 1990 1990 ...
 $ stn1 : num  0 0 0 0 0 0 0 0 0 0 ...
 $ stn2 : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Day  : num  1 2 3 4 5 6 7 8 9 10 …

Quiero llenar las NA de fecha específica con la media de la misma fecha de todo el año en la serie de tiempo.

He usado el siguiente código para crear la media de los días, sin embargo, no puedo imputarlo en mi marco de datos df.

library(dplyr)

Mean <- function(x) {mean(x, na.rm = T)}

daily_mean <- Rainfall[-1] %>% group_by(Month, Day) %>% 
  summarise_all(list(Mean))

El marco de datos "daily_mean" se ve así

str(daily_mean)
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 366 obs. of  14 variables:
 $ Month        : Ord.factor w/ 12 levels "Jan"<"Feb"<"Mar"<..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Day          : num  1 2 3 4 5 6 7 8 9 10 ...
 $ Year         : num  2004 2004 2004 2004 2004 ...
 $ stn1         : num  1.31 0.54 1.57 1.41 0 ...
 $ stn2         : num  0.689 0.111 0 0 0 ...

¿Hay alguna forma de imputar el marco de datos "df" de "daily_mean"?

1
Vasker Sharma 4 dic. 2019 a las 13:49

2 respuestas

La mejor respuesta

Valores group_by Month y Day y replace NA con mean del grupo.

library(dplyr)

df %>% 
   group_by(Month, Day) %>% 
   mutate_all(~replace(., is.na(.), mean(., na.rm = TRUE)))
2
Ronak Shah 4 dic. 2019 a las 11:11

Aquí hay una opción con na.aggregate

library(dplyr)
library(zoo)
df %>%
   group_by(Month, Day) %>%
    mutate_at(vars(-group_cols()), na.aggregate)

O si usamos la función Mean

df %>%
    group_by(Month, Day) %>%
     mutate_at(vars(-group_cols()), ~ case_when(is.na(.) ~ Mean(.), TRUE ~ .))

O usando split con na.aggregate

nm1 <- setdiff(names(df), c("Month", "Day"))
df[nm1] <- unsplit(lapply(split(df[nm1], df[c("Month", "Day")], drop = TRUE), 
        na.aggregate), df[c("Month", "Day")])
1
akrun 4 dic. 2019 a las 13:48