Является ли ошибка rbind временных рядов XTS ошибкой или функцией - PullRequest
2 голосов
/ 09 мая 2019

У меня есть два часовых временных ряда xts, которые я устанавливаю для ежедневной периодичности с apply.daily.В этом же вызове я выбираю / подставляю один столбец из данных.Когда я объединяю два ежедневных временных ряда с rbind, я получаю сообщение об ошибке.

Я уже нашел решение, но мне было любопытно, ожидается ли такое поведение или нет.

Здесьнекоторый код для воспроизведения ошибки в R версии 3.5.2 (Linux Debian) и xts_0.11-2:

data1 <- xts(matrix(1:144, ncol = 2), as.POSIXct("2019-05-09 00:00:00") -
          seq.int(60*60, by = 60*60, length.out = 72))
data2 <- xts(matrix(1:144, ncol = 2), as.POSIXct("2019-05-05 00:00:00") -
          seq.int(60*60, by = 60*60, length.out = 72))

colnames(data1) <- c("col1", "col2")
colnames(data2) <- c("col1", "col2")

data1.daily <- apply.daily(data1[,"col1"], colSums)
data2.daily <- apply.daily(data2[,"col1"], colSums)

data.daily <- rbind(data1.daily, data2.daily)

Вызывает следующую ошибку:

Error in rbind(deparse.level, ...) : length of 'dimnames' [1]
 not equal to array extent

Главный виновникэто первая строка атрибута chr [1:3] "col1" "col1" "col1", которая выглядит странной для меня:

str(data1.daily)

An ‘xts’ object on 2019-05-06 23:00:00/2019-05-08 23:00:00 containing:
  Data: num [1:3, 1] 1452 876 300
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:3] "col1" "col1" "col1"
  ..$ : chr "col1"
  Indexed by objects of class: [POSIXct,POSIXt] TZ: 
  xts Attributes:  
 NULL

Я легко могу решить проблему, поменяв местами шаги:

data <- rbind(data1, data2)
data.daily <- apply.daily(data[,"col1"], colSums)

Но я бы предпочел сохранитьданные, как только они имеют более низкую частоту.

Таким образом, вопрос не в том, как решить проблему, а в том, может ли это быть ошибкой или какой-либо дополнительной настройкой для другой цели.

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Я не совсем уверен, что происходит, но удаление имен строк из первого xts объекта, кажется, исправляет это.

rownames(data1.daily) <- NULL
rbind(data1.daily, data2.daily)
#                     col1
# 2019-05-02 23:00:00 1452
# 2019-05-03 23:00:00  876
# 2019-05-04 23:00:00  300
# 2019-05-06 23:00:00 1452
# 2019-05-07 23:00:00  876
# 2019-05-08 23:00:00  300

Верно.Используйте sum(), а не colSums() в apply.daily().

data1.daily <- apply.daily(data1[,"col1"], sum)
data2.daily <- apply.daily(data2[,"col1"], sum)
rbind(data1.daily, data2.daily)
#                     col1
# 2019-05-02 23:00:00 1452
# 2019-05-03 23:00:00  876
# 2019-05-04 23:00:00  300
# 2019-05-06 23:00:00 1452
# 2019-05-07 23:00:00  876
# 2019-05-08 23:00:00  300

Ошибка возникает в apply.daily (или действительно period.apply()), когда основной вызов sapply() возвращает именованныйвектор.Эти имена позже заканчиваются именами строк.Я бы не назвал это ошибкой, поскольку использование colSums() в этой настройке не имеет особого смысла.Должно быть довольно легко сделать функцию более устойчивой к таким ошибкам, если это необходимо, но это зависит от Иисуса Навина.

0 голосов
/ 10 мая 2019

Вы можете написать функцию для этой цели.Я не уверен, однако, если вам нужны данные как data.frame или что-то еще.Во всяком случае, я предоставлю первое, так как это было довольно сложно.

res <- do.call(rbind, lapply(list(data1.daily, data2.daily), function(x) {
  t <- as.POSIXct(attr(x, "index"), 
                  origin="1970-01-01")
  value <- as.numeric(x$col1)
  return(data.frame(t, value))
}))
res
#                     t value
# 1 2019-05-06 23:00:00  1452
# 2 2019-05-07 23:00:00   876
# 3 2019-05-08 23:00:00   300
# 4 2019-05-02 23:00:00  1452
# 5 2019-05-03 23:00:00   876
# 6 2019-05-04 23:00:00   300

class(res)
# [1] "data.frame"
...