2016-12-23 20 views
2

我有NA值的面板數據象下面這樣:如何「推斷」R中面板數據的值?

uid year month day value 
1 1 2016 8 1 NA 
2 1 2016 8 2 NA 
3 1 2016 8 3 30 
4 1 2016 8 4 NA 
5 1 2016 8 5 20 
6 2 2016 8 1 40 
7 2 2016 8 2 NA 
8 2 2016 8 3 50 
9 2 2016 8 4 NA 
10 2 2016 8 5 NA 

我想執行線性內插,所以我寫此代碼:

library(dplyr) 
library(zoo) 

panel_df <- group_by(panel_df, userid) 
panel_df <- mutate(panel_df, value=na.approx(value, na.rm=FALSE)) 

然後我得到的輸出:

uid year month day value 
1 1 2016 8 1 NA 
2 1 2016 8 2 NA 
3 1 2016 8 3 30 
4 1 2016 8 4 25 
5 1 2016 8 5 20 
6 2 2016 8 1 40 
7 2 2016 8 2 45 
8 2 2016 8 3 50 
9 2 2016 8 4 NA 
10 2 2016 8 5 NA 

這裏approx方法成功插值NA值,但不外推。

有沒有什麼好的方法可以將第一行和第二行的值替換爲該用戶的第一個非NA值(30)?相似,我如何用這個用戶的最後一個非NA值(50)替換第9行和第10行的值?要做到這一點

回答

5

一種方式是通過使用na.spline()來自同一個包zoo

panel_df <- group_by(panel_df, uid) 
panel_df <- mutate(panel_df, value=na.spline(value)) 
panel_df 
Source: local data frame [10 x 5] 
Groups: uid [2] 

    uid year month day value 
    <int> <int> <int> <int> <dbl> 
1  1 2016  8  1 40 
2  1 2016  8  2 35 
3  1 2016  8  3 30 
4  1 2016  8  4 25 
5  1 2016  8  5 20 
6  2 2016  8  1 40 
7  2 2016  8  2 45 
8  2 2016  8  3 50 
9  2 2016  8  4 55 
10  2 2016  8  5 60