我想根据前一行中的值选择向量的子集。这在没有循环的情况下是可能的吗?更具体地说,使用时间序列表示法(我组成了第二行),我希望得到 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 的解决方案,因为我总是可以循环它。但是很想知道逻辑向量索引是否有移位运算符或类似的东西
我想根据前一行中的值选择向量的子集。这在没有循环的情况下是可能的吗?更具体地说,使用时间序列表示法(我组成了第二行),我希望得到 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 的解决方案,因为我总是可以循环它。但是很想知道逻辑向量索引是否有移位运算符或类似的东西
与其他答案没有太大区别,但更紧凑:
x[x > 0 &
c(FALSE, head(x,-1) < 0) &
c(FALSE, diff(x) > 2)]
我不确定你在找什么。但是为了这个简单的目的,您可以使用:
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)'的操作,我不知道一种优雅的方式,但你可以尝试将丑陋的代码包装在一个函数中,然后调用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)
这就是我发现完成我想要的事情
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) ,而无需调整向量的大小