2013-07-16 3 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 

Я действительно не нужно решения для у, как я могу всегда кольцует. Но было бы очень интересно узнать, есть ли оператор сдвига или что-то подобное для логического векторного индексирования

ответ

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 

Для работы на многих «х (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) вы можете использовать diff(x,lag=i)

+0

Большое спасибо за ответ, и он хорошо работает. Но я надеялся увидеть, есть ли способ сделать это прямо на самом векторе x. Поскольку в этом случае, если бы мне нужно было включить x (t-2) x (t-3) ... это означало бы определение многих других векторов, и код стал бы очень уродливым – hjw

+0

Я думаю, вы можете настроить функцию для обертывания уродливый код, а затем вызвать функцию на вашем векторе. – Zhenglei

+0

duh! Просто понял, что 'x [-1]' является лучшим способом записи 'x [2: length (x)]', как и в моем ответе, ditto 'x [-length (x)]' for 'x [1 : (длина (х) -1)] '. – TooTone

0

не сильно отличается от других ответов, но немного более компактна:

x[x > 0 & 
    c(FALSE, head(x,-1) < 0) & 
    c(FALSE, diff(x) > 2)] 
Смежные вопросы