我有一个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)
我真的很感激有关如何进行此计算的任何建议。
答案 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.approx
,maxgap = 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
,则可能会出现错误,因为在这种情况下“线性插值”部分没有多大意义。所以你必须以其他方式填补这些内容。