2016-08-09 4 views
0

Ich bin auf der Suche nach Mitgliedschaftslücken für eine Gruppe von Kunden, wo das Datum des Inkrafttretens ist, wo ihre Mitgliedschaft begann, und das Datum der Beendigung ist, wenn ihre Mitgliedschaft endete. Ein Beendigungsdatum von 2100-01-01 bedeutet ein aktuelles Mitglied.Erstellen Sie eine Bit-Matrix ohne Schleife R

Ich dachte, ein guter Weg, dies zu tun wäre, um eine Bit-Matrix aus einer Mitgliedschaft Datenbank zu erstellen, die ich habe. Ich möchte Mitglied ID als Zeilen und jeden Tag als Spalte.

Die Tabelle ist wie folgt:

member_id|effective_date|termination_date 
    1 | 2015-06-12 | 2015-12-19 
    1 | 2016-03-17 | 2016-06-23 
    2 | 2015-12-03 | 2100-01-01 

Ich habe es zu tun mehrere Schleifen zu arbeiten, aber es dauert ewig. Wie kann ich das mit R effizienter gestalten? Mein Endziel ist es, Kunden mit weniger als zwei Mitgliederlücken im vergangenen Jahr zu identifizieren, und die Lücke beträgt weniger als 60 Tage.

Danke für die Hilfe.

Edit: Ich werde in der Lage sein, die Jahresspanne zu ändern. Ich habe derzeit

past_year = c(seq(as.Date('2015-07-01'),as.Date('2016-06-30'),'day')) 

Ich würde eine Lücke zu jeder Zeit ein Mitglied hatte keine Mitgliedschaft während der Bandbreite, die ich betrachte. In obigem Beispiel für "past_year" wäre eine Lücke zwischen 2015-07-01 und 2016-06-30 immer dann vorhanden, wenn sie nicht Mitglied sind. Beide Mitglieder in der Tabelle würden als Lücken betrachtet werden.

+0

Ich denke, ein wenig mehr Daten sind notwendig. Mit "das letzte Jahr" meinst du 2015 oder 365 Tage vor heute? Wenn ein Mitglied nur eine Zeile im Datensatz hat, zählt das als "keine Lücken" oder würde ein Beendigungsdatum vor dem heutigen Tag als eine Lücke gelten? – jdobres

+0

@jdobres Danke für einen Blick. Ich habe die Frage aktualisiert – badger0053

Antwort

1

Vielleicht ein Skript wie folgt.

Die dplyr Bibliothek ist wirklich nützlich für diese Arten von Aggregationen. Legen Sie das und erstellen einige Beispieldaten:

library(dplyr) 

data.example <- data.frame(
    member_id = c(1, 1, 2, 3), 
    effective_date = as.Date(c('2015-06-12', '2016-03-17', '2015-12-03', '2010-01-01')), 
    termination_date = as.Date(c('2015-12-19', '2016-06-23', '2100-01-01', '2010-02-01')) 
) 

Ihr Jahr Bereich kann nur zwei Werte annehmen:

past_year = as.Date(c('2015-07-01', '2016-06-30')) 

Schränken Sie Ihre Analyse nur Mitglieder mit Terminen in Ihrem Bereich:

data.in.range <- subset(data.example, 
         !((termination_date < min(past_year) & effective_date < min(past_year)) | 
         (termination_date > max(past_year) & effective_date > max(past_year))) 
       ) 

Berechnen Sie die Anzahl der Tage, an denen dieses Mitglied Mitglied war, und melden Sie, ob es mehr als einen Mitgliedschaftszeitraum oder eine Mitgliedschaft weniger als die Zeitspanne Ihres Datumsbereichs gab.

gaps <- group_by(data.in.range, member_id) %>% 
    summarize(
    num.entries = length(member_id), 
    num.days = sum(termination_date - effective_date), 
    has.gap = num.days < abs(diff(past_year)) | num.entries > 1 
    ) 

    member_id num.entries  num.days has.gap 
     <dbl>  <int> <S3: difftime> <lgl> 
1   1   2  288 days TRUE 
2   2   1  30710 days FALSE 

Ich bin mir nicht sicher, ob dies genau das ist, was Sie nach, aber in jedem Fall sollten die Bereiche Computing ausgeschaltet werden viel schneller als Bit-Werte für jeden Tag des Bereichs Erstellen und Durchschleifen.

Verwandte Themen