Создание определенного вектора без цикла или рекурсии в R - PullRequest
1 голос
/ 16 августа 2010

У меня есть первый вектор, скажем, х, который состоит только из 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)] элемент за элементом.

Большое спасибо за вашу поддержку

Ответы [ 2 ]

3 голосов
/ 16 августа 2010

Вот подход, использующий функцию 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 голос
/ 16 августа 2010

Вы можете использовать apply, как это, хотя это, по сути, прекрасный способ сделать цикл, я не уверен, будет ли он быстрее (может или не может).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...