замена пропущенного значения за час среднегодовым значением этого часа дня - PullRequest
0 голосов
/ 09 марта 2012

У меня есть почасовой набор данных с 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 ]

2 голосов
/ 10 марта 2012

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 голос
/ 09 марта 2012

Вы, вероятно, могли бы сделать это, используя удобную функцию из пакета zoo . Например, na.approx с maxgap = 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 s, вы можете получить ошибки, поскольку в этом случае фрагмент "линейной интерполяции" не имеет большого смысла. Поэтому вам придется заполнить их другим способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...