Sagen Sie, ich habe Daten, die wie folgt aussehen:
%Vor%oder das:
%Vor%Sie erzeugen die folgenden Grafiken:
Wie Sie sehen können, gibt es mehrere Zeitintervalle auf verschiedenen Ebenen. Das Level-1-Intervall erstreckt sich immer über die gesamte Dauer der interessierenden Zeit. Level 2+ haben kürzere Zeitintervalle.
Was ich tun möchte, ist die maximale Anzahl nicht überlappender Zeitintervalle für jede Periode auszuwählen, die die maximale Anzahl der Gesamtzeit darin enthalten. Ich habe pink markiert, welche das sind.
Für kleine Datenrahmen ist es möglich, dies zu erzwingen, aber offensichtlich sollte es einen logischeren Weg geben, dies zu tun. Ich bin daran interessiert, einige Ideen zu hören, was ich ausprobieren sollte.
BEARBEITEN:
Ich denke, eine Sache, die hier helfen könnte, ist die Spalte "level". Die Ergebnisse stammen von Kleinbergs Burst-Detection-Algorithmus (Paket 'Bursts'). Sie werden feststellen, dass die Ebenen hierarchisch organisiert sind. Ebenen mit derselben Nummer können nicht überlappen. Stufen, die jedoch z. 2,3,4 in aufeinanderfolgenden Zeilen können sich überlappen.
Im Wesentlichen glaube ich, dass das Problem dadurch verkürzt werden könnte. Nehmen Sie die produzierten Level, aber entfernen Sie Level 1. Dies wäre der Vektor für das zweite Beispiel:
%Vor%Dann schau dir die 2s an ... wenn es weniger als oder nur eine '3' gibt, dann ist das 2 das längste Intervall. Aber wenn zwei oder mehr 3 zwischen aufeinanderfolgenden 2en liegen, dann sollten diese 3s gezählt werden. Tun Sie dies iterativ für jedes Level. Ich denke, das sollte funktionieren ...?
z.B.
%Vor%Das Obige identifiziert die Zeilen 5 und 6 (die den Reihen 6 und 7 im ursprünglichen df entsprechen) als zwei Viere, die zwischen den Dreien liegen. Vielleicht könnte etwas mit dieser Art von Ansatz funktionieren?
OK, hier ist ein Stich mit Ihrem zweiten Datensatz zum Testen. Dies ist möglicherweise nicht in allen Fällen korrekt !!
%Vor% Ich habe diese letzten Schritte geschrieben, damit Sie in Ihrer eigenen interaktiven Sitzung verfolgen können, was passiert (siehe den Ausdruck, um eine Idee zu bekommen), aber Sie können den Druck entfernen und auch die letzten Schritte zu etwas wie lapply(1:dat[,max(level)-1], function(the.level) dat[use=="maybe" & level==the.level,use:=make.pass......])
dat[use=="maybe" & level==max(level),use:="yes"]
folgen.
Ausgabe:
%Vor%Wenn das nicht stimmt, kann der Algorithmus grob wie folgt beschrieben werden:
by=rownum
), das heißt X . Berücksichtigen Sie bei X eine Kopie der Daten in alle Intervalle höherer Ebene. Lassen Sie mich wissen, was Sie davon halten - dies ist ein grober Entwurf und einige Aspekte könnten nicht korrekt sein.
Tags und Links r