好吧,以便標題相當滿意,但這裏是我解決的問題,我很好奇,如果任何人有更好的解決方案或可以進一步推廣它。查找當前觀察組的行範圍內的data.table列的最大值
我有一個時間序列作爲data.table
,我很想知道觀察結果是否「趨向於趨勢」,從而說明前後的數據。即這個觀測值是否大於前後觀測年份?
要做到這一點,我的想法是建立在另一列,從上面或下面的行抓取最大值,然後檢查一行是否等於最大值。
我的數據很幸運地定期訂購,意味着每行與其相鄰行的距離相同。我使用這個事實來手動指定窗口大小,而不是檢查每行是否在感興趣的時間距離內。
#######################
# Package Loading
usePackage <- function(p) {
if (!is.element(p, installed.packages()[,1]))
install.packages(p, dep = TRUE)
require(p, character.only = TRUE)
}
packages <- c("data.table","lubridate")
for(package in packages) usePackage(package)
rm(packages,usePackage)
#######################
set.seed(1337)
# creating a data.table
mydt <- data.table(Name = c(rep("Roger",12),rep("Johnny",8),"Mark"),
Date = c(seq(ymd('2010-06-15'),ymd('2015-12-15'), by = '6 month'),
seq(ymd('2012-06-15'),ymd('2015-12-15'), by = '6 month'),
ymd('2015-12-15')))
mydt[ , Value := c(rnorm(12,15,1),rnorm(8,30,2),rnorm(1,100,30))]
setkey(mydt, Name, Date)
# setting the number of rows up or down to check
windowSize <- 2
# applying the windowing max function
mydt[,
windowMax := unlist(lapply(1:.N, function(x) max(.SD[Filter(function(y) y>0 & y <= .N, unique(abs(x+(-windowSize:windowSize)))), Value]))),
by = Name]
# checking if a value is the local max (by window)
mydt[, isMaxValue := windowMax == Value]
mydt
正如你所看到的,窗口函數是一團糟,但它的確有用。我的問題是:你知道更簡單,更簡潔或更可讀的方法來做同樣的事情嗎?你知道如何概括這個以考慮不規則的時間序列(即不是固定的窗口)嗎?我無法讓zoo::rollapply
做我想做的事情,但我沒有那麼多的經驗(我無法解決1行導致功能崩潰的問題)。
讓我知道你的想法,謝謝你!
Nifty!我總是忘記'shift()',這是data.table v1.9.6(2015年9月19日發佈)中的新增功能。 – cocquemas