0

我想根据前一行中的值选择向量的子集。这在没有循环的情况下是可能的吗?更具体地说,使用时间序列表示法(我组成了第二行),我希望得到 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 的解决方案,因为我总是可以循环它。但是很想知道逻辑向量索引是否有移位运算符或类似的东西

4

3 回答 3

1

与其他答案没有太大区别,但更紧凑:

x[x > 0 & 
    c(FALSE, head(x,-1) < 0) & 
    c(FALSE, diff(x) > 2)]
于 2013-07-16T11:12:48.093 回答
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)'的操作,我不知道一种优雅的方式,但你可以尝试将丑陋的代码包装在一个函数中,然后调用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)

于 2013-07-16T10:41:01.237 回答
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) ,而无需调整向量的大小

于 2013-09-10T10:06:51.873 回答