Вычислить диапазон по списку объектов `xts`

В R у меня есть список объектов xts, и я хочу вычислить диапазон индекса времени по всем элементам в списке. Однако я не могу найти простой способ сделать это, он продолжает терять классы объектов и становиться необработанными числовыми векторами.

Например (мой список называется states, он проиндексирован по Гринвичу POSIXct):

> c(min(sapply(states, start)), max(sapply(states, end)))
[1] 1252714110 1315785360

> range(sapply(states, function(x) range(index(x))))
[1] 1252714110 1315785360

Преобразовать их обратно в POSIXct проблематично, я делаю это так:

minmax <- range(sapply(states, function(x) range(index(x))))
epoch <-   as.POSIXct(0, origin="1970-01-01", tz="GMT")
rg <- as.POSIXct(minmax, origin="1970-01-01", tz="GMT")

Совет ценится!


person Ken Williams    schedule 26.09.2011    source источник


Ответы (1)


Используйте lapply, чтобы найти диапазон индекса каждого элемента списка. Затем используйте do.call, чтобы найти диапазон списка:

do.call(range, lapply(states, function(x) range(index(x))))

или, если вы предпочитаете функциональную парадигму:

Reduce(range, Map(function(x) range(index(x)), states))

sapply не работает, потому что процесс упрощения преобразует выходные данные в атомарный вектор или матрицу с одним типом: NULL ‹ исходное ‹ логическое ‹ целое ‹ вещественное ‹ сложное ‹ символ ‹ список ‹ выражение, в таком порядке приоритета.

person Joshua Ulrich    schedule 26.09.2011
comment
Отлично, спасибо! Я подозревал, что проблема заключается в упрощении, но не мог придумать, как это обойти. - person Ken Williams; 26.09.2011