Lauflängensequenz nach Zeit und ID

8

Dieses Problem scheint hier noch nicht bekannt geworden zu sein.

Ich möchte die Anzahl der Fächer finden, die für 6 aufeinanderfolgende Stunden 1 erhalten. Die Fächer wurden nicht stündlich bewertet. Wenn also eine Stunde fehlt, sind die Stunden nicht aufeinanderfolgend und die Ausgabe für diesen 6-Stunden-Zeitraum sollte NA sein. Der Grund für die Zuweisung von NA wäre, dass wir nicht wissen, wie das Subjekt in der fehlenden Stunde gewertet hat. Dieses Problem kann verwendet werden, um aufeinander folgende Treffer zu zählen, aber nur zählen, wenn ein Thema teilgenommen hat.

Mein Datenrahmen sieht so aus:

%Vor%

Ich habe versucht, die rle-Funktion zu benutzen (ich bin mir sicher, dass es möglich ist), aber ich kann es nicht sowohl für die Stunde als auch für die ID bekommen. Die Ausgabe wäre wie folgt:

%Vor%

Vielen Dank im Voraus.

Ich glaube, der ursprüngliche Datensatz, den ich gab, war zu klein, um die Lösungen verallgemeinerbarer zu machen.
Ich habe gerade die Codes mit diesem Datensatz ausprobiert und festgestellt, dass dies zu einem falschen Ergebnis führt.

%Vor%

Für den neuen Datensatz sollte die Ausgabe lauten:

%Vor%     
Lars G 14.02.2018, 13:09
quelle

3 Antworten

7

Hier ist ein Ansatz in Tidyverse mit dem aktualisierten Datensatz:

%Vor%

Überprüfung der angeforderten Ausgabe:

%Vor%

Die alte Antwort:

%Vor%

Lässt prüfen, ob das Ergebnis wie gewünscht ist:

%Vor%

df1 wird angefordert

%Vor%

ein Benchmarking:

%Vor%

Weg zu gehen Mike H.!

    
missuse 14.02.2018, 13:38
quelle
7

Um die Gruppierungen zu erhalten, können Sie die aktuelle Stunde mit der verzögerten Stunde vergleichen, um zu sehen, ob sie "aufeinanderfolgend" oder 1 ganzzahlig auseinander liegen, und dann die cumsum davon nehmen. Sobald Sie die Gruppierungen haben, können Sie eine einfache ave verwenden, um die gewünschte Ausgabe zu erhalten.

%Vor%

Wenn Sie nur einmal einen Patienten auswählen möchten, wird der letzte Zeitraum ausgewählt:

%Vor%     
Mike H. 14.02.2018 13:36
quelle
5

Wir können rleid von data.table verwenden. Erstellen Sie eine Gruppierungsspalte mit der Lauflängen-ID 'A' ('grp'). Nimm die Differenz von "Stunde" mit dem nächsten Wert von "Stunde", überprüfe, ob es gleich 1 ist und multipliziere mit "A", um "Neu" zu erstellen. Nach run-length-id von 'Neu' und 'grp' gruppiert, ist if der sum von 'A' größer als ein bestimmter Wert, repliziere mit 0s und 1s oder gebe sonst NA zurück. In der letzten Phase ordnen Sie einige Spillover-NAs auf 0 zu, indem Sie einen Index ('i1') erstellen

%Vor%

Oder etwas kompaktere Option wäre

%Vor%

Benchmarks

Erstellt einen etwas größeren Datensatz und testete die Lösungen

-Daten

%Vor%

-Funktionen

%Vor%

-benchmark

%Vor%

-Ausgabe

%Vor%     
akrun 14.02.2018 13:38
quelle

Tags und Links