用一小时的年平均值替换每小时的缺失值

时间:2012-03-09 14:37:07

标签: r

我有一个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)

我真的很感激有关如何进行此计算的任何建议。

2 个答案:

答案 0 :(得分:2)

动物园里的

na.aggregate就是这么做的。它只需要一行代码来填充缺失的值:

# 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)

答案 1 :(得分:1)

您可以使用 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"))

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