2016-12-20 3 views
1

Допустим, у меня есть следующий вектор:Как обнаружить циклы в векторе в R

vec = c(29, 30, 15, 29, 17, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28) 

Вы заметите, что есть три повторяющиеся элементы (25, 24 и 28). Как я могу получить R, чтобы распознавать, когда в векторе повторяются элементы (или циклы)? Я хочу обнаружить это независимо от того, сколько элементов повторяется (2 или 5, а не 3) и независимо от того, сколько элементов в векторе начинается.

Для контекста у меня есть алгоритм, который пытается сблизиться по значению, но иногда он застревает в этом повторяющемся цикле. Я хочу, чтобы R обнаружил, когда он застрял в этом бесконечном цикле и вышел. В моем примере vec является журналом значения на каждой итерации.

Я понял, как я могу поймать двойные повторяющиеся элементы (сохраняя значение из последней итерации для сравнения с текущей итерацией), но эти 3+ повторяющиеся элементы меня озадачили.

+0

"циклы", вероятно, лучше, чем описание "повторяющихся элементов" – sirallen

+0

Спасибо! Обновлено. – CephBirk

+0

Соответствующий возможно - http://stackoverflow.com/questions/15328925/number-sequence-recognition – thelatemail

ответ

0

Перед тем, как провести анализ, используйте метод duplicated(). Если длина вектора возврата равна 0, то дубликатов нет.

+0

Хорошая идея. Я не хочу, чтобы он поймал значения, которые повторяются, даже если они не являются частью дублированного шаблона. Я обновил 'vec' выше. Я не хочу, чтобы '29' был отмечен. – CephBirk

+0

Откуда вы знаете, что '29' не является шаблоном, но' 25, 24,28' является шаблоном? Вы говорите, что шаблон должен иметь 2 или более повторяющихся элемента? Если это так, тогда вам просто нужно искать 2 повторяющихся элемента. –

+0

Я заинтересован в поиске повторяющихся элементов (циклов) больше длины = 1. Итак, в первом случае за «29» следует «30», а во втором случае - «17». Поэтому '29' в этом случае не является частью цикла. – CephBirk

0

Это может работать:

Если я позволю vec запустить немного дольше:

vec = c(29, 30, 15, 29, 17, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28) 

Тогда я могу найти циклы до 10 элементов длиной с этим. Более длинные циклы могут быть включены путем изменения 10, но, надеюсь, вам никогда не придется иметь дело с этим!

any(sapply(1:10, function(i) all(tail(diff(vec, lag = i), 10) == 0))) 
1

Эта функция будет искать шаблоны из 2 повторений. Я вычисляю хэш пар элементов [i] с [i + 1], умножая второй на «100» и добавляя к первому. Вы можете изменить этот коэффициент на какой-то другой номер, предполагая, что ваши целые числа ограничены этим фактором. Вы можете изменить это на 1000000. Если у вас большие целые числа, вы можете пересмотреть это.

Затем я хочу убедиться, что хеши все уникальны, то есть переход от [i] до [i + 1] происходит только один раз.

hasCycle <- function(v) { 
    hash <- v[1:length(v)-1] + 100 * v[2:length(v)] 
    length(unique(hash)) != length(hash) 
} 

Вот мой тест

> a <- c(1, 2,3,4,5,1,6,7) 
> hasCycle(a) 
[1] FALSE 
> 
> b <- c(1, 2,3,4,5,9,7,3,4) 
> hasCycle(b) 
[1] TRUE