用当月的平均值替换缺失值

Replace missing value with average of that month

我有每日入住率数据,入住率中有一些空值。

我想为相应 ID 替换相应月份的占用率。

我将用示例数据(模拟数据)进行解释:

Date       ID   Occupancy%
1/2/2018    1   95
2/2/2018    1   94
3/2/2018    1   94
4/2/2018    1   96
5/2/2018    1   94
6/2/2018    1   NA
7/2/2018    1   96
8/2/2018    1   94
1/2/2018    2   75
2/2/2018    2   NA
3/2/2018    2   79
4/2/2018    2   82
5/2/2018    2   NA
6/2/2018    2   76
7/2/2018    2   78
8/2/2018    2   80

我想用那个月的平均值和它的 ID 替换 NA。

我希望结果是

  1. 6/2/2018 1 NA 应该是 6/2/2018 1 94.7
  2. 1/2/2018 2 NA 应该是 1/2/2018 2 78.3
  3. 5/2/2018 2 NA 应该是 5/2/2018 2 78.3

关于如何在 r 中实现这一点有什么建议吗?

或者在SQL中是否容易执行,如果可以如何执行?

a=with(dat,ave(Occupancy.,sub(".*?\/","",Date),ID,FUN=function(x)mean(x,na.rm=T)))
> transform(dat,b=replace(x<-Occupancy.,y<-is.na(x),a[y]))
       Date ID Occupancy.        b
1  1/2/2018  1         95 95.00000
2  2/2/2018  1         94 94.00000
3  3/2/2018  1         94 94.00000
4  4/2/2018  1         96 96.00000
5  5/2/2018  1         94 94.00000
6  6/2/2018  1         NA 94.71429
7  7/2/2018  1         96 96.00000
8  8/2/2018  1         94 94.00000
9  1/2/2018  2         75 75.00000
10 2/2/2018  2         NA 78.33333
11 3/2/2018  2         79 79.00000
12 4/2/2018  2         82 82.00000
13 5/2/2018  2         NA 78.33333
14 6/2/2018  2         76 76.00000
15 7/2/2018  2         78 78.00000
16 8/2/2018  2         80 80.00000