找到大于x的连续响应

时间:2011-05-11 05:55:14

标签: r

我试图找到参与者连续达到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 个答案:

答案 0 :(得分:2)

为什么不创建一个包含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 :(得分:1)

您可以只转换数据,以便仅对代码进行编码以区分感兴趣的度量(大于3),然后您的代码将在xx替换x时起作用。

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

答案 2 :(得分:1)

这是一种仅使用cumsumcummax执行此操作的矢量化方式。让我们举个例子,它有一个短的(长度小于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