2017-06-19 74 views
2

我還是R的新手。從這個示例表中,您可以清楚地看到差異列上有一些累計值。因此,如何將這些值傳播到NA值,這些值會將許多行累積到一行中,因爲我的設備在某些時段記錄值出現缺失值時出現問題,但他們在未來一小時仍可以獲得正確的值。R:如何將累積值拆分爲數據框中的缺失值?

我的示例數據:

        DateTime diff1 diff2 
1      2017-06-11 05:00:00 366 25 
2      2017-06-11 06:00:00 380 22 
3      2017-06-11 07:00:00 365 40 
4      2017-06-11 08:00:00 366 45 
5      2017-06-11 09:00:00 361 91 
6      2017-06-11 10:00:00 1782 NA 
7      2017-06-11 11:00:00 NA 46 
8      2017-06-11 12:00:00 NA 44 
9      2017-06-11 13:00:00 NA 89 
10     2017-06-11 14:00:00 NA NA 
11     2017-06-11 15:00:00 345 46 

我必須設置手動狀態,如果它比的值(約1000或其他)時,它將被刪除,更改爲大約值。但這是我愚蠢的最糟糕的主意。這不適用於我的整個數據(大約1k行或更多)只是一個小例子。我不知道如何解決這個問題,並設置最佳條件來過濾和填充適當的值,以便在填充值之前獲得更明智的數據準備。

輸出應該是這樣的:

binning by mean of accumulated value    
           DateTime diff1 diff2 
1      2017-06-11 05:00:00 366.0 25.0 
2      2017-06-11 06:00:00 380.0 22.0  
3      2017-06-11 07:00:00 365.0 40.0  
4      2017-06-11 08:00:00 366.0 45.0   
5      2017-06-11 09:00:00 361.0 45.5  
6      2017-06-11 10:00:00 356.4 45.5    
7      2017-06-11 11:00:00 356.4 46.0  
8      2017-06-11 12:00:00 356.4 44.0  
9      2017-06-11 13:00:00 356.4 44.5  
10     2017-06-11 14:00:00 356.4 44.5   
11     2017-06-11 15:00:00 345.0 46.0 
[OR] by na.approx()   
           DateTime diff1 diff2 
1      2017-06-11 05:00:00 366.0000 25.00000 
2      2017-06-11 06:00:00 380.0000 22.00000 
3      2017-06-11 07:00:00 365.0000 40.00000 
4      2017-06-11 08:00:00 366.0000 45.00000 
5      2017-06-11 09:00:00 361.0000 45.33333 
6      2017-06-11 10:00:00 358.3333 45.66667 
7      2017-06-11 11:00:00 355.6667 46.00000 
8      2017-06-11 12:00:00 353.0000 44.00000 
9      2017-06-11 13:00:00 350.3333 44.66667 
10     2017-06-11 14:00:00 347.6667 45.33333 
11     2017-06-11 15:00:00 345.0000 46.00000 

最點我需要的是過濾改爲NA這些明智累積值。 任何想法請幫助。先生,謝謝你。

回答

2

這裏是一個基礎R溶液:

df[c('diff1', 'diff2')] <- lapply(df[c('diff1', 'diff2')], function(x){ 
    g <- cumsum(!is.na(x)) 
    ave(x, g, FUN = function(y) y[1]/length(y)) 
}) 

# > df 
#    DateTime diff1 diff2 
# 1 2017-06-11 05:00:00 366.0 25.0 
# 2 2017-06-11 06:00:00 380.0 22.0 
# 3 2017-06-11 07:00:00 365.0 40.0 
# 4 2017-06-11 08:00:00 366.0 45.0 
# 5 2017-06-11 09:00:00 361.0 45.5 
# 6 2017-06-11 10:00:00 356.4 45.5 
# 7 2017-06-11 11:00:00 356.4 46.0 
# 8 2017-06-11 12:00:00 356.4 44.0 
# 9 2017-06-11 13:00:00 356.4 44.5 
# 10 2017-06-11 14:00:00 356.4 44.5 
# 11 2017-06-11 15:00:00 345.0 46.0 

我使用的原始數據的dput

sample.df <- structure(list(DateTime = c("2017-06-11 05:00:00", "2017-06-11 06:00:00", 
"2017-06-11 07:00:00", "2017-06-11 08:00:00", "2017-06-11 09:00:00", 
"2017-06-11 10:00:00", "2017-06-11 11:00:00", "2017-06-11 12:00:00", 
"2017-06-11 13:00:00", "2017-06-11 14:00:00", "2017-06-11 15:00:00" 
), diff1 = c(366L, 380L, 365L, 366L, 361L, 1782L, NA, NA, NA, 
NA, 345L), diff2 = c(25L, 22L, 40L, 45L, 91L, NA, 46L, 44L, 89L, 
NA, 46L)), .Names = c("DateTime", "diff1", "diff2"), row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11"), class = "data.frame") 
+0

謝謝,它的工作原理。但是,我可以只過濾去除累計值變爲NA部分嗎?我想從包'zoo'中的'na.approx()'嘗試它。 –

+0

@SirawitTakeo,我以前沒有'na.approx'的經驗。我剛剛嘗試了一點,但可以找到一種方法來獲得所需的結果。 – mt1022

+0

它不像應該的那麼接近真實值,但對情節非常順利。 –