2016-12-20 1 views
1

Sagen wir, ich den folgenden Vektor haben:Wie Zyklen in einem Vektor in R erkennen

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

Sie werden es merken, sind drei sich wiederholende Elemente (25, 24 und 28). Wie kann ich R erkennen, wenn sich Elemente (oder Zyklen) in einem Vektor wiederholen? Ich möchte dies feststellen, egal wie viele Elemente sich wiederholen (2 oder 5 statt 3) und egal wie viele Elemente in den Vektor eingefügt werden.

Für Kontext, ich habe einen Algorithmus bekam, der auf einen Wert zu konvergieren versucht, aber manchmal wird es in dieser sich wiederholenden Schleife stecken. Ich möchte, dass R erkennt, wenn es in dieser Endlosschleife feststeckt und aussteigt. Die vec in meinem Beispiel ist ein Protokoll des Werts bei jeder Iteration.

Ich habe herausgefunden, wie ich doppelte sich wiederholende Elemente fangen kann (den Wert aus der letzten Iteration speichern, um mit der aktuellen Iteration zu vergleichen), aber diese 3+ wiederholenden Elemente haben mich verwirrt.

+0

"Zyklen" ist wahrscheinlich eine bessere Beschreibung als "sich wiederholende Elemente" – sirallen

+0

Dank! Aktualisiert. vielleicht – CephBirk

+0

Relevante - http://stackoverflow.com/questions/15328925/number-sequence-recognition – thelatemail

Antwort

0

Bevor Sie Ihre Analyse ausführen, verwenden Sie die duplicated() Methode. Wenn die Länge des Rückkehrvektors 0 ist, dann gibt es keine Duplikate.

+0

Gute Idee. Ich möchte nicht, dass Werte erfasst werden, die sich wiederholen, auch wenn sie nicht Teil eines duplizierten Musters sind. Ich habe 'vec' oben aktualisiert. Ich möchte nicht, dass "29" markiert wird. – CephBirk

+0

Woher weißt du, dass '29' kein Muster ist, aber' 25, 24,28' ein Muster ist? Willst du sagen, dass ein Muster 2 oder mehr Wiederholungen haben muss? Wenn ja, dann müssen Sie nur nach zwei wiederholten Elementen suchen. –

+0

Ich bin daran interessiert, wiederholte Elemente (Zyklen) größer als Länge = 1 zu finden. Im ersten Fall folgt auf "29" also "30", während im zweiten Fall eine "17" folgt. So ist '29' in diesem Fall kein Teil eines Zyklus. – CephBirk

0

könnte diese Arbeit:

Wenn ich vec erlauben ein wenig länger zu laufen:

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) 

Dann kann ich Zyklen finden lang bis zu 10 Elementen mit diesem. Längere Zyklen kann durch Änderung 10 eingebaut werden, aber ich werde hoffentlich nie damit zu tun haben!

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

Diese Funktion sucht nach Mustern von 2 Wiederholungen. Ich berechne einen Hash von Paaren von Element [i] mit [i + 1], indem ich die zweite mit "100" multipliziere und zur ersten addiere. Sie können diesen Faktor in eine andere Zahl ändern, vorausgesetzt, Ihre Ganzzahlen sind durch diesen Faktor begrenzt. Vielleicht möchten Sie dies auf 1000000 ändern. Wenn Sie große Ganzzahlen haben, sollten Sie dies vielleicht noch einmal überdenken.

Dann schaue ich sicherstellen, dass die Hashes alle einzigartig sind, das heißt den Übergang von [i] [i + 1] nur einmal passiert.

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

Hier ist mein Test

> 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