2013-07-16 70 views
0

我想根據前一行中的值選擇一個向量的子集。這是沒有循環的情況嗎?更具體地講,利用時間序列符號(我做了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的一個解決方案,我可以一直循環播放。但會很感興趣,知道是否有一個移位運算符或類似的邏輯向量索引

回答

0

這是我發現要完成什麼,我也喜歡

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),無需您調整矢量大小

1

我不知道你在找什麼。但是,對於這個簡單的目的,你可以使用:

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)可以使用​​

+0

非常感謝您的回覆,並且效果很好。但我希望看看是否有辦法直接在x矢量本身上做到這一點。因爲在這種情況下,如果我需要包括x(t-2)x(t-3)...這意味着定義了許多其他向量,代碼變得非常難看 – hjw

+0

我想你可以設置一個函數來包裝醜陋的代碼,然後調用你的向量上的函數。 – Zhenglei

+0

呵呵!剛剛意識到'x [-1]'是寫作'x [2:length(x)]'的一種更好的方式,就像我在我的回答中所做的那樣,對於x [1]同上'x [-length(x)]' :(長度(X)-1)]'。 – TooTone

0

並不比其他答案太大的不同,但有點更緊湊:

x[x > 0 & 
    c(FALSE, head(x,-1) < 0) & 
    c(FALSE, diff(x) > 2)]