我试图找到参与者连续达到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)
代码工作正常。但这不是我的数据的样子。
提前致谢!
答案 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)
这是一种仅使用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