1

我有第一个向量,假设 x 仅由 1 和 -1 组成。然后,我有第二个向量 y,它由 1、-1 和零组成。现在,我想创建一个向量 z ,它包含在索引 ia 1 中,如果x[i]等于 1 并且 1 存在于向量 y 中的 n 个先例元素之间(y[(i-n):i])...

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

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

多谢您的支持

4

2 回答 2

3

这是一种使用该cumsum函数来测试到目前为止已经看到的数量的方法。如果 positioni的个数大于 position 的个数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
于 2010-08-16T09:32:08.577 回答
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)
于 2010-08-16T06:29:53.190 回答