заполнить пробелы во временных рядах средними - PullRequest
4 голосов
/ 08 сентября 2011

У меня есть такой фрейм данных:

day         sum_flux  samples mean
2005-10-26     0.02     48    0.02
2005-10-27     0.12     12    0.50

Это серия ежедневных чтений, охватывающая 5 лет, однако некоторые дни отсутствуют. Я хочу заполнить эти дни средним значением этого месяца по сравнению с другими годами.

т.е. если 26-10-2005 отсутствовали, я бы хотел использовать среднее значение всех октоберов в наборе данных. если бы пропал весь октябрь, я бы хотел применить это среднее значение к каждому пропущенному дню.

Я думаю, что мне нужно построить функцию (возможно, с использованием plyr) для оценки дней. Однако я очень неопытен с использованием различных объектов временных рядов в R и условно поднабора данных и хотел бы получить несколько советов. Особенно в отношении того, какой тип временных рядов мне следует использовать.

Большое спасибо

Ответы [ 2 ]

6 голосов
/ 08 сентября 2011

Некоторые примеры данных. Я предполагаю, что sum_flux - это столбец, в котором отсутствуют значения, и для которого вы хотите вычислить значения.

library(lubridate)
days <- seq.POSIXt(ymd("2005-10-26"), ymd("2010-10-26"), by = "1 day")
n_days <- length(days)
readings <- data.frame(
  day      = days,
  sum_flux = runif(n_days),
  samples  = sample(100, n_days, replace = TRUE),
  mean     = runif(n_days)
)
readings$sum_flux[sample(n_days, floor(n_days / 10))] <- NA

Добавить столбец месяца.

readings$month <- month(readings$day, label = TRUE)

Используйте tapply, чтобы получить среднемесячный поток.

monthly_avg_flux <- with(readings, tapply(sum_flux, month, mean, na.rm = TRUE))

Используйте это значение всякий раз, когда поток отсутствует, или сохраняйте поток, если нет.

readings$sum_flux2 <- with(readings, ifelse(
  is.na(sum_flux), 
  monthly_avg_flux[month], 
  sum_flux
))
2 голосов
/ 09 сентября 2011

Это один (очень быстрый) способ в data.table .

Используя хорошие примеры данных от Ричи:

require(data.table)
days <- seq(as.IDate("2005-10-26"), as.IDate("2010-10-26"), by = "1 day")
n_days <- length(days)
readings <- data.table(
    day      = days,
    sum_flux = runif(n_days),
    samples  = sample(100, n_days, replace = TRUE),
    mean     = runif(n_days)
)
readings$sum_flux[sample(n_days, floor(n_days / 10))] <- NA
readings
             day   sum_flux samples       mean
 [1,] 2005-10-26 0.32838686      94 0.09647325
 [2,] 2005-10-27 0.14686591      88 0.48728321
 [3,] 2005-10-28 0.25800913      51 0.72776002
 [4,] 2005-10-29 0.09628937      81 0.80954124
 [5,] 2005-10-30 0.70721591      23 0.60165240
 [6,] 2005-10-31 0.59555079       2 0.96849533
 [7,] 2005-11-01         NA      42 0.37566491
 [8,] 2005-11-02 0.01649860      89 0.48866220
 [9,] 2005-11-03 0.46802818      49 0.28920807
[10,] 2005-11-04 0.13024856      30 0.29051080
First 10 rows of 1827 printed.

Создайте среднее для каждогомесяц, в порядке появления каждой группы:

> avg = readings[,mean(sum_flux,na.rm=TRUE),by=list(mnth = month(day))]
> avg
      mnth        V1
 [1,]   10 0.4915999
 [2,]   11 0.5107873
 [3,]   12 0.4451787
 [4,]    1 0.4966040
 [5,]    2 0.4972244
 [6,]    3 0.4952821
 [7,]    4 0.5106539
 [8,]    5 0.4717122
 [9,]    6 0.5110490
[10,]    7 0.4507383
[11,]    8 0.4680827
[12,]    9 0.5150618

Следующее изменение порядка avg начнется в январе:

avg = avg[order(mnth)]
avg
      mnth        V1
 [1,]    1 0.4966040
 [2,]    2 0.4972244
 [3,]    3 0.4952821
 [4,]    4 0.5106539
 [5,]    5 0.4717122
 [6,]    6 0.5110490
 [7,]    7 0.4507383
 [8,]    8 0.4680827
 [9,]    9 0.5150618
[10,]   10 0.4915999
[11,]   11 0.5107873
[12,]   12 0.4451787

Теперь обновите по ссылке (:=) sum_fluxстолбец, где sum_flux равно NA, со значением от avg за этот месяц.

readings[is.na(sum_flux), sum_flux:=avg$V1[month(day)]]
             day   sum_flux samples       mean
 [1,] 2005-10-26 0.32838686      94 0.09647325
 [2,] 2005-10-27 0.14686591      88 0.48728321
 [3,] 2005-10-28 0.25800913      51 0.72776002
 [4,] 2005-10-29 0.09628937      81 0.80954124
 [5,] 2005-10-30 0.70721591      23 0.60165240
 [6,] 2005-10-31 0.59555079       2 0.96849533
 [7,] 2005-11-01 0.51078729**    42 0.37566491  # ** updated with the Nov avg
 [8,] 2005-11-02 0.01649860      89 0.48866220
 [9,] 2005-11-03 0.46802818      49 0.28920807
[10,] 2005-11-04 0.13024856      30 0.29051080
First 10 rows of 1827 printed. 

Готово.

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