在R中创建没有循环或递归的特定向量

时间:2010-08-16 06:00:20

标签: r vectorization

我有一个第一个向量,让我们说x只包含1和-1。然后,我有第二个向量y,由1,-1和0组成。现在,我想创建一个向量z,如果x[i]等于1,则在索引i中包含1,并且在n个先前元素(y[(i-n):i])之间的向量y中存在1 ...

更正式:z <- ifelse(x == 1 && 1 %in% y[(index(y)-n):index(y)],1,0)

我希望在R中创建这样的矢量而不需要循环或递归。上面的命题不起作用,因为它不承认按元素表达y[(index(y)-n):index(y)]元素。

非常感谢您的支持

2 个答案:

答案 0 :(得分:3)

这是一种使用cumsum函数测试到目前为止已经看过的数量的方法。如果位置i的位数大于位置i-n的位数,则会满足右侧的条件。

## Generate some random y's.
> y <- sample(-1:1, 25, replace=T)
> y
 [1]  0  1 -1 -1 -1 -1 -1  1 -1 -1 -1 -1  0  0 -1 -1 -1  1 -1  1  1  0  0  0  1
> n <- 3
## Compute number of ones seen at each position.
> cs <- cumsum(ifelse(y == 1, 1, 0))
> lagged.cs <- c(rep(0, n), cs[1:(length(cs)-n)])
> (cs - lagged.cs) > 0
 [1] FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[25]  TRUE

答案 1 :(得分:1)

你可以像这样使用apply,虽然它本质上是一种循环的好方法,但我不确定它是否会更快(它可能会也可能不会)。

y1 <- unlist(lapply(1:length(x), function(i){1 %in% y[max(0, (i-n)):i]}))
z <- as.numeric(x==1) * as.numeric(y1)