我想根据前一行中的值选择向量的子集。这是没有循环的可能吗?更具体地说,使用时间序列表示法(我编写了第二行),我希望得到y
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 :(得分: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(t-i)'的操作,我不知道一种优雅的方式,但你可以尝试将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)
答案 1 :(得分:0)
与其他答案没什么不同,但更紧凑:
x[x > 0 &
c(FALSE, head(x,-1) < 0) &
c(FALSE, diff(x) > 2)]
答案 2 :(得分: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
它非常优雅地处理lag(x,-i)而无需调整矢量