我试图找到参与者连续达到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切换)所以我还在学习。
提前致谢!如果我需要提供更多细节,请告诉我。
答案 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