我想根據前一行中的值選擇一個向量的子集。這是沒有循環的情況嗎?更具體地講,利用時間序列符號(我做了2號線),我希望得到Ÿ基於前一行的R中的邏輯向量
x = c(-2,3,-1,2,8,)
y = x(t)[x(t)>0, x(t-1)<0, x(t)-x(t-1)>2]
y
[1] 3
我並不真的需要y的一個解決方案,我可以一直循環播放。但會很感興趣,知道是否有一個移位運算符或類似的邏輯向量索引
我想根據前一行中的值選擇一個向量的子集。這是沒有循環的情況嗎?更具體地講,利用時間序列符號(我做了2號線),我希望得到Ÿ基於前一行的R中的邏輯向量
x = c(-2,3,-1,2,8,)
y = x(t)[x(t)>0, x(t-1)<0, x(t)-x(t-1)>2]
y
[1] 3
我並不真的需要y的一個解決方案,我可以一直循環播放。但會很感興趣,知道是否有一個移位運算符或類似的邏輯向量索引
這是我發現要完成什麼,我也喜歡
x = c(-2,3,-1,2,8)
x = zoo(x)
y = x[x>0 & lag(x,-1)<0 & (x-lag(x,-1))>2]
y
2 4
3 2
它非常優雅地處理滯後(x,-i),無需您調整矢量大小
我不知道你在找什麼。但是,對於這個簡單的目的,你可以使用:
x <- c(-2,3,-1,2,8)
x1 <- x[-length(x)]
z <- x[-1]
y <- z[z>0 & x1<0 & (z-x1)>2]
y
對於很多「X(TI)的」工作,我不知道一個優雅的方式,但你可以嘗試來包裝uggly代碼的函數,然後就打電話fts(x)
fts <- function(x){
xmat <- sapply(1:10,function(i){
x[-1:i]
})
......
}
另外,對於'x(t)-x(t-1)'
,您可以使用diff(x)
;爲x(t)-x(t-i)
可以使用
並不比其他答案太大的不同,但有點更緊湊:
x[x > 0 &
c(FALSE, head(x,-1) < 0) &
c(FALSE, diff(x) > 2)]
非常感謝您的回覆,並且效果很好。但我希望看看是否有辦法直接在x矢量本身上做到這一點。因爲在這種情況下,如果我需要包括x(t-2)x(t-3)...這意味着定義了許多其他向量,代碼變得非常難看 – hjw
我想你可以設置一個函數來包裝醜陋的代碼,然後調用你的向量上的函數。 – Zhenglei
呵呵!剛剛意識到'x [-1]'是寫作'x [2:length(x)]'的一種更好的方式,就像我在我的回答中所做的那樣,對於x [1]同上'x [-length(x)]' :(長度(X)-1)]'。 – TooTone