Преобразование кадра данных с несколькими значениями для одной даты в объект ts в R - PullRequest
0 голосов
/ 16 ноября 2018

У меня большой набор данных с несколькими значениями для определенных дней. В наборе данных отсутствуют значения, так как это происходит в течение длительного периода времени. Вот небольшой пример:

set.seed(1)
data <- data.frame(
 Date = sample(c("1993-07-09", "1993-07-09", "1993-07-10", "1993-08-11", "1993-08-11", "1993-08-11")),
 Oxygen = sample(c(0.2, 0.4, 0.4, 0.2, 0.4, 0.5))
)
data$Date <- as.Date(data$Date)

Я хочу преобразовать этот фрейм данных в ts объект , чтобы я мог прогнозировать, использовать модели аримы и в конечном итоге находить выбросы.

В частности, это должен быть объект ts, а не объект xts.

Проблема, с которой я сталкиваюсь: 1) Я не знаю, как преобразовать фрейм данных в объект TS. 2) Создайте объект ts, который позволяет использовать несколько значений в течение одного дня.

Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

0 голосов
/ 16 ноября 2018

(1) мтс ts объекты должны регулярно располагаться (т.е. одинаковое количество времени между каждой последовательной точкой) и не могут представлять даты (но мы можем использовать числа), поэтому мы предполагаем, чтоавгустовские даты должны были быть июльскими, поэтому у нас есть последовательные даты, и мы используем количество дней с начала эпохи (1 января 1970 г.) в качестве времени.

Добавьте порядковый номер, чтобы различать равные даты и разделитьряд в несколько столбцов:

library(zoo)

data3 <- transform(data2, seq = ave(1:nrow(data2), Date, FUN = seq_along))
z <- read.zoo(data3, index = "Date", split = "seq")
as.ts(z)

, дающий:

Time Series:
Start = 8590 
End = 8592 
Frequency = 1 
       1   2   3
8590 0.5 0.4  NA
8591 0.4  NA  NA
8592 0.2 0.2 0.4

(2) среднее Поочередное усреднение значений в равные даты:

z2 <- read.zoo(data2, index = "Date", aggregate = mean)
as.ts(z2)

давая:

Time Series:
Start = 8590 
End = 8592 
Frequency = 1 
[1] 0.4500000 0.4000000 0.2666667

(3) Игнорировать дату Мы могли бы проигнорировать столбец Дата (как было предложено на плакате), и в этом случае мы просто используем 1, 2, 3,... в качестве временного индекса:

ts(data$Oxygen)

(4) 1-ая точка каждого месяца Поскольку в комментарии автор указал, что существует много данных (20 лет), которые мыможет взять первую точку в каждом месяце, образуя месячный ряд.

as.ts(read.zoo(data, index = "Date", FUN = as.yearmon, aggregate = function(x) x[1]))

Примечание

AuguДаты были изменены на июль и теперь имеют вид data2:

set.seed(1)
data2 <- data.frame(
 Date = sample(c("1993-07-09", "1993-07-09", "1993-07-10", 
  "1993-07-11", "1993-07-11", "1993-07-11")),
 Oxygen = sample(c(0.2, 0.4, 0.4, 0.2, 0.4, 0.5))
)
data2$Date <- as.Date(data$Date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...