【问题标题】:R : How to split the accumulated value to missing values in data frame?R:如何将累积值拆分为数据框中的缺失值?
【发布时间】:2017-06-19 07:34:18
【问题描述】:

我还是 R 新手。从这个示例表中,您可以清楚地看到 diff 列上有一些累积值。那么如何将这些值传播到 NA 值,因为我的设备在记录值时会在几个小时内出现缺失值的问题,但它们仍然可以在接下来的一个小时内获得正确的值。

我的示例数据:

                                 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 dataframe missing-data


    【解决方案1】:

    这是一个基本的 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")
    

    【讨论】:

    • 谢谢,它有效。但是我可以只过滤掉更改为 NA 部分的累积值吗?我想用na.approx() 包中的zoo 试试。
    • @SirawitTakeo,我以前没有使用过na.approx 的经验。我刚刚尝试了一点,但可以找到一种方法来获得想要的结果。
    • 它并没有像它应该的那样接近真实值,但它在情节上非常流畅。
    猜你喜欢
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多