R:如何将累积值拆分为数据框中的缺失值?

问题描述:

我还是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这些明智累积值。 任何想法请帮助。先生,谢谢你。

这里是一个基础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

它不像应该的那么接近真实值,但对情节非常顺利。 –