找到x个连续响应的点

时间:2011-03-26 23:57:11

标签: r

我试图找到参与者连续达到8个连续响应的点。数据来自类别学习任务,因此变量看起来像:

R> data
 [1] 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1..

我试图找到参与者达到我们学习标准的试验编号 - 连续8个正确的答案(1表示正确的答案)。所以我想从上面的例子中返回18,因为在第18次试验中,参与者排成了8个正确答案。

很抱歉,如果在别处已经回答了这个问题。我环顾四周,发现了一些类似的问题,但没有什么我可以弄清楚如何直接适用于我的问题。我今天刚开始使用R(从SPSS切换)所以我还在学习。

提前致谢!如果我需要提供更多细节,请告诉我。

3 个答案:

答案 0 :(得分:3)

设置

x <- c(1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

这有两种方式:

1)嵌入。使用embed找到1的第一行,如下所示:

> which(rowSums(embed(x, 8)) == 8)[1] + 8 - 1
[1] 18

2) rollapply 。动物园包装有点不那么棘手。然后我们取最后8个值的滚动总和,然后找到它首先变为8的时间:

> library(zoo)
> r <- rollapply(zoo(x), 8, sum, align = "right")
> time(r[r == 8][1])
[1] 18

答案 1 :(得分:2)

rle提供了一种查看运行长度的方法。首先找到所有等于或大于8的运行值== 1.然后在此之前总结所有长度并添加8。

> which( rle(x)$values==1 & rle(x)$lengths >= 8)
[1] 5

如果有多个,则取最小值并从中减去一个索引:

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

答案 2 :(得分:0)

带循环的基本解决方案:

check_continous_values <- function(d, n) {
    for (i in n:length(d)) {
        if (sum(d[(i-(n-1)):i]) == n) return(i)
    }   
}

看到它的实际效果:

> d <- c(1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
> check_continous_values(d,8)
[1] 18