найти точку х смежных ответов - PullRequest
2 голосов
/ 27 марта 2011

Я пытаюсь найти точку, в которой участники достигают 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 ]

3 голосов
/ 27 марта 2011

Настройка

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

Существует два способа:

1) embed .Используя 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
2 голосов
/ 27 марта 2011

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
0 голосов
/ 27 марта 2011

Базовое решение с циклом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...