1

Ich arbeite in der Gesundheitsbranche und verwende maschinelle Lernalgorithmen, um ein Modell zu entwickeln, um vorherzusagen, wann Patienten nicht zu ihren Terminen erscheinen. Ich versuche ein neues Feature zu erstellen, das die Summe der letzten aufeinanderfolgenden No-Shows jedes Patienten darstellt. Ich habe mich viel mit Stackoverflow und anderen Ressourcen befasst, kann aber nicht genau das finden, wonach ich suche. Wenn zum Beispiel ein Patient seine letzten zwei Termine nicht angezeigt hat, wird jede Zeile der Spalte des neuen Merkmals mit ihrer ID mit 2 gefüllt. Wenn sie dreimal nicht angezeigt wurde, aber zu ihrem letzten Termin erschienen ist, wird die neue Spalte mit Nullen gefüllt.Erstellen einer neuen Spalte mit fortlaufender Zählung der ersten Serie basierend auf der ID-Spalte

Ich versuchte mit plys ddply mit Cumsum, aber es gab mir nicht die Ergebnisse, die ich suche. Früher habe ich:

ddply(a, .(ID), transform, ConsecutiveNoshows = cumsum(Noshow)) 

Hier ist ein Beispiel Daten gesetzt ('1' bedeutet eine No-Show):

ID Noshow 
1  1 
1  1 
1  0 
1  0 
1  1 
2  0 
2  1 
2  1 
3  1 
3  0 
3  1 
3  1 
3  1 

Das ist mein gewünschtes Ergebnis:

ID Noshow ConsecutiveNoshows 
1  1     2 
1  1     2 
1  0     2 
1  0     2 
1  1     2 
2  0     0 
2  1     0 
2  1     0 
3  1     1 
3  0     1 
3  1     1 
3  1     1 
3  1     1 

Ich werde Sei sehr dankbar für jede Hilfe. Vielen Dank.

Antwort

0

Die Idee ist, sum() für jede ID die Anzahl der Noshow vor einem 0 erscheint.

library(dplyr) 
df %>% 
    group_by(ID) %>% 
    mutate(ConsecutiveNoshows = sum(!cumsum(Noshow == 0) >= 1)) 

Welche gibt:

#Source: local data frame [13 x 3] 
#Groups: ID [3] 
# 
#  ID Noshow ConsecutiveNoshows 
# <int> <int>    <int> 
#1  1  1     2 
#2  1  1     2 
#3  1  0     2 
#4  1  0     2 
#5  1  1     2 
#6  2  0     0 
#7  2  1     0 
#8  2  1     0 
#9  3  1     1 
#10  3  0     1 
#11  3  1     1 
#12  3  1     1 
#13  3  1     1 
+1

Steven, bewarb ich mich Ihre Lösung für meine viel größere Datenmenge und es funktionierte genau wie beabsichtigt. Vielen Dank, dass Sie mir den Denkprozess beigebracht haben, mit dem Sie die Lösung gefunden haben. –

+0

@JamesMarquez Froh, dass es geholfen hat :) –