Я много работаю с временными рядами. Большинство моих манипуляций выполняются с помощью data.table
, но часто я должен проверить данные, вызываемые определенное время, и для этого я использую xts
метод:Добавление нового метода в data.table
> timedata['2014-01-02/2014-01-03']
Мои данные data.table
является в основном точная копия xts
, с первых colums index
, время, содержащий:
> dt_timedata <- data.table(index=index(timedata), coredata(timedata))
в некоторых точечных данных стал слишком большим, поэтому держать оба или преобразования их все время не очень хороший вариант (который он никогда не был на самом деле), так что я имею в виду о том, тот же метод для data.table
. Тем не менее, я не мог найти никаких разумных примеров изменения общего метода.
Я хочу, чтобы это было возможно, и если да, где я мог бы прочитать об этом?
PS Несмотря на то, что я могу abviosly использовать что-то вроде
> from <- '2014-01-02'
> to <- '2014-01-03'
> period <- as.POSIXct(c(from, to))
> dt_timedata[index %between% period]
это гораздо менее интуитивным и красиво, поэтому я предпочел бы написать новый метод.
Edit1 (например, по запросу)
require(xts)
require(data.table)
days <- as.POSIXct(c('2014-01-01', '2014-01-02', '2014-01-03', '2014-01-04'), origin='1970-01-01')
timedata <- xts(1:4, days)
dt_timedata <- data.table(index=index(timedata), coredata(timedata))
Что я могу сделать в xts
:
> timedata['2014-01-01/2014-01-02']
[,1]
2014-01-01 1
2014-01-02 2
Я хочу точно такой же для [.data.table
.
Edit2 (чтобы проиллюстрировать, что я делаю)
'[.data.table' = function(x, i, ...) {
if (!missing('i')) {
if (all(class(i) == "character")) {
# do some weird stuff
return(x[ *some indices subset I just created* ])
}
}
data.table:::'[.data.table'(x, i, ...)
}
Так в основном, если i
является характер и подходит мой формат (проверка происходит в странном разделе вещи) я что-то вернуть и функция никогда не переходит в последнюю команду , В противном случае ничего не происходит, и я просто называю
data.table:::'[.data.table'(x, i, ...)
И дело, это разбивает такие выражения, как
ind <- as.POSIXct('2014-01-01', origin='1970-01-01')
dt_timedata[index==ind]
Вот простой пример для вас попробовать:
require(data.table)
days <- as.POSIXct(c('2014-01-01', '2014-01-02', '2014-01-03', '2014-01-04'), origin='1970-01-01')
dt_timedata <- data.table(index=days, value=1:4)
ind <- as.POSIXct('2014-01-01', origin='1970-01-01')
# now it works
dt_timedata[index==ind]
# new trivial [.data.table
'[.data.table' = function(x, I, ...) {
data.table:::`[.data.table`(x, I, ...)
}
# and now it doesn't work
dt_timedata[index==ind]
вы можете обеспечить воспроизводимый пример? – nsheff
@sheffien добавил в сообщение – user2794728