найти смежные ответы больше, чем х - PullRequest
0 голосов
/ 11 мая 2011

Я пытаюсь найти точку, в которой участники достигают 8 последовательных ответов подряд, превышающих 3. Например:

x <- c(2,2,4,4,4,4,5,5,5,5,7)

я хочу вернуть значение 10.

я попробовал код (Спасибо @DWin):

which( rle(x)$values>3 & rle(x)$lengths >= 8)
sum(rle(x)$lengths[ 1:(min(which(rle(x)$lengths >= 8))-1) ]) + 8

проблема с приведенным выше кодом заключается в том, что он работает, только если все ответы идентичны и больше 3. таким образом, код возвращаетноль.

если:

x <- c(2,2,4,4,4,4,4,4,4,4,7)

код работает нормально.но мои данные выглядят не так.

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 11 мая 2011

Почему бы вам не создать новый вектор, который содержит идентичные значения, необходимые rle для правильной работы? Вы можете использовать ifelse() для этого и поместить все в функцию:

FUN <- function(x, value, runlength) {
  x2 <- ifelse(x > value, 1, 0)

  ret <- sum(rle(x2)$lengths[ 1:(min(which(rle(x2)$lengths >= runlength))-1) ]) + runlength
  return(ret)
}

> FUN(x, value = 3, runlength = 8)
[1] 10
1 голос
/ 11 мая 2011

Вот векторизованный способ сделать это с помощью cumsum и cummax.Давайте рассмотрим пример с короткой (менее 8 длины) последовательностью элементов, превышающей 3, а также с длинной, просто для того, чтобы убедиться, что он работает правильно.

> x <- c(2,2,4,5,6,7,2,2,4,9,8,7,6,5,4,5,6,9,2,2,9)
> x3 <- x > 3
> cumsum(x3) - cummax(cumsum(x3)*(!x3))
 [1]  0  0  1  2  3  4  0  0  1  2  3  4  5  6  7  8  9 10  0  0  1
> which( cumsum(x3) - cummax(cumsum(x3)*(!x3)) == 8)[1]
[1] 16
1 голос
/ 11 мая 2011

Вы можете просто преобразовать свои данные так, чтобы ответы кодировались только в зависимости от степени интереса (больше 3), и тогда ваш код будет работать, заменяя x на x1.

x1 <- ifelse( x > 3, 4, 0 )

Но если бы я уже делал это, я мог бы переписать код немного более четко таким образом.

runl <- rle(x1)
i <- which( runl$length > 8 & runl$value > 3 )[1]
sum( runl$length[1:(i-1)] ) + 8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...