如何根据 R 中的子组和日期估算数据

How to impute data based on subgroup and date in R

我有一个包含气象信息的数据集。它包括变量:

问题是并不是所有的站都测量相同的变量,所以有很多缺失值。此外,在具有特定传感器的站点中,并非所有日期都被记录,因为传感器可能离线或某些日期不合格。

我想要的(但我不知道如何实现)是:给定一个站中的一些缺失数据,用站中的值的平均值填充缺失值同城的其他车站。

例如,考虑这个最小的代码示例:

df = tibble(
  DATE = lubridate::ymd_hm(rep(c('2020-01-01 12:00', '2020-01-02 12:00','2020-01-03 12:00','2020-01-04 12:00','2020-01-05 12:00'), 4)),
  STATION = rep(c('A', 'B', 'C', 'D'), each=5),
  CITY = rep(c('LONDON', 'PARIS'), each=10),
  var = c(NA,NA,NA,4,5,6,7,8,NA,10,NA,NA,13,14,15,16,17,18,19,20)
)

第一个观测值属于 STATION A 和 CITY LONDON,但已丢失。但是 STATION B 也在 LONDON 中,在那一天它的值为 6,所以我希望缺失值可以用 6 来估算。

第 8 行属于 STATION B 和城市 LONDON,但已丢失。但是 STATION 那天的 A 的值为 4,所以我希望缺失值可以用 4 来估算。依此类推,预期输出将是:

   DATE                STATION CITY     var
   <dttm>              <chr>   <chr>  <dbl>
 1 2020-01-01 12:00:00 A       LONDON     6
 2 2020-01-02 12:00:00 A       LONDON     7
 3 2020-01-03 12:00:00 A       LONDON     8
 4 2020-01-04 12:00:00 A       LONDON     4
 5 2020-01-05 12:00:00 A       LONDON     5
 6 2020-01-01 12:00:00 B       LONDON     6
 7 2020-01-02 12:00:00 B       LONDON     7
 8 2020-01-03 12:00:00 B       LONDON     8
 9 2020-01-04 12:00:00 B       LONDON     4
10 2020-01-05 12:00:00 B       LONDON    10
11 2020-01-01 12:00:00 C       PARIS     16
12 2020-01-02 12:00:00 C       PARIS     17
13 2020-01-03 12:00:00 C       PARIS     13
14 2020-01-04 12:00:00 C       PARIS     14
15 2020-01-05 12:00:00 C       PARIS     15
16 2020-01-01 12:00:00 D       PARIS     16
17 2020-01-02 12:00:00 D       PARIS     17
18 2020-01-03 12:00:00 D       PARIS     18
19 2020-01-04 12:00:00 D       PARIS     19
20 2020-01-05 12:00:00 D       PARIS     20

请注意,实际上有 5 个不同的城市,每个城市有 4 个不同的站点,每小时进行一次观测。[=​​25=]

left_join(
  df, 
  df %>% group_by(DATE,CITY) %>% summarize(city_mean = mean(var,na.rm=T)), 
  by=c("DATE","CITY")
) %>% 
  mutate(var = if_else(is.na(var), city_mean, var)) %>% 
  select(!city_mean)

如果您不喜欢连接方法,您也可以这样做:

df %>% 
  rowwise() %>% 
  mutate(var=if_else(
    is.na(var),
    mean(df[df$CITY==CITY & df$DATE==DATE,]$var,na.rm=T),
    var))

输出(在任一方法下):

   DATE                STATION CITY     var
   <dttm>              <chr>   <chr>  <dbl>
 1 2020-01-01 12:00:00 A       LONDON     6
 2 2020-01-02 12:00:00 A       LONDON     7
 3 2020-01-03 12:00:00 A       LONDON     8
 4 2020-01-04 12:00:00 A       LONDON     4
 5 2020-01-05 12:00:00 A       LONDON     5
 6 2020-01-01 12:00:00 B       LONDON     6
 7 2020-01-02 12:00:00 B       LONDON     7
 8 2020-01-03 12:00:00 B       LONDON     8
 9 2020-01-04 12:00:00 B       LONDON     4
10 2020-01-05 12:00:00 B       LONDON    10
11 2020-01-01 12:00:00 C       PARIS     16
12 2020-01-02 12:00:00 C       PARIS     17
13 2020-01-03 12:00:00 C       PARIS     13
14 2020-01-04 12:00:00 C       PARIS     14
15 2020-01-05 12:00:00 C       PARIS     15
16 2020-01-01 12:00:00 D       PARIS     16
17 2020-01-02 12:00:00 D       PARIS     17
18 2020-01-03 12:00:00 D       PARIS     18
19 2020-01-04 12:00:00 D       PARIS     19
20 2020-01-05 12:00:00 D       PARIS     20