【问题标题】:replacing hourly missing value with yearly average of that hour of the day用一天中那个小时的年平均值替换小时缺失值
【发布时间】:2012-03-09 14:37:07
【问题描述】:

我有一个从 1996 年到 2010 年的每小时数据集,格式如下:

             date         value  
1- - -1996-01-01 00:00:00- - -  NA  
2- - -1996-01-01 01:00:00- - -  38  
3 - - -1996-01-01 02:00:00- - - 44  
4- - -1996-01-01 03:00:00- - -  48  
5- - -1996-01-01 04:00:00- - -  42  
6- - -1996-01-01 05:00:00- - -  44  
7- - - 1996-01-01 06:00:00- - - 38  
8- - - 1996-01-01 07:00:00- - - 42  
9- - -1996-01-01 08:00:00- - -  44  
10- - -1996-01-01 09:00:00- - - 44  

我有很多缺失的小时数数据,我试图通过取前一小时和下一小时的平均值来计算缺失的小时值,如果缺失了很多小时,我试图通过每天取该小时的平均值来计算那一年,只是想知道这是否可能?

我尝试了以下方法,但这给了我整个数据集的平均值:

a = c(NA, 1, 2, 3, 10)   
a[which(is.na(a)==TRUE)] = mean(a,na.rm = T)

我非常感谢有关如何进行此计算的任何建议。

【问题讨论】:

    标签: r


    【解决方案1】:

    na.aggregate in zoo 就是这样做的。填写缺失值只需一行代码:

    # read in the data
    
    Lines <- "1996-01-01 00:00:00 NA  
    1996-01-01 01:00:00 38  
    1996-01-01 02:00:00 43
    1997-01-01 00:00:00 44  
    1997-01-01 01:00:00 45"
    
    library(zoo)
    library(chron)
    z <- read.zoo(text = Lines, index = 1:2, FUN = paste, FUN2 = as.chron)
    
    # fill in the missing values
    
    na.aggregate(z, hours, FUN = mean)
    

    【讨论】:

    • 也感谢您的回复,我会在这个星期一尝试,并告诉您进展如何,谢谢
    【解决方案2】:

    您可能可以使用 zoo 包中的一些方便的功能来做到这一点。例如,na.approxmaxgap = 1 应该线性插值长度为 1 的所有间隙。然后你可能想使用na.aggregate,按年和小时划分,用那个时期的平均值来填补更长的空白。

    下面是一个简单的例子,让您了解这些函数的工作原理:

    set.seed(124)
    tt <- as.POSIXct("2000-01-01 10:00:00") + 3600*c(1:100,10000:10100)
    dd <- runif(201)
    
    aa <- data.frame(x1 = tt,x2 = dd)
    aa$x2[sample(201,30)] <- NA
    aa$x3 <- na.approx(aa$x2,maxgap = 1)
    aa$x4 <- na.aggregate(aa$x3,by = format(aa$x1,"%Y-%H"))
    

    请注意,如果您的系列有前导或尾随 NAs,您可能会遇到错误,因为在这种情况下“线性插值”部分没有多大意义。因此,您必须以其他方式填写这些内容。

    【讨论】:

    • 感谢您的建议,我会在这个星期一尝试,并告诉您进展如何!非常感谢
    猜你喜欢
    • 2018-02-05
    • 2012-05-03
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 2013-09-07
    相关资源
    最近更新 更多