2017-08-24 2 views
3

Ich habe ein neues Projekt mit einer Reihe von Datenverwaltung gestartet, die ich noch nie zuvor gemacht hatte, und mir fehlen anscheinend die Fähigkeiten oder die passenden Suchbegriffe, um ein Beispiel zu finden. Ich habe einen sehr großen Datensatz mit einer Gruppierungsvariablen und einer binären Ereignisvariablen. Es kann zu einem Arbeitsbeispiel verallgemeinern:Erstellen Sie einen neuen Faktor/eine neue Variable mit Ebenen basierend auf "N" aufeinanderfolgenden Vorkommen von ursprünglichen Faktor-Ebene

library('data.table') 
grp <- c("a", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b") 
v1 <- c(1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1) 
test<-data.frame(grp,v1) 
test 

    grp v1 
1 a 1 
2 a 0 
3 a 0 
4 a 1 
5 a 1 
6 a 1 
7 a 1 
8 b 1 
9 b 0 
10 b 0 
11 b 0 
12 b 1 

Ich habe mit einem neuen Ordnungszahlenfaktor „Ereignis“ innerhalb einzigartige Level „grp“ als Ereignisse data.table zu Etikettenstreifen „v1“ wurde unter Verwendung von:

setDT(test) 
test<-test[, .(v1 = v1, event = rleidv(v1)), by=grp] 

    grp v1 event 
1: a 1  1 
2: a 0  2 
3: a 0  2 
4: a 1  3 
5: a 1  3 
6: a 1  3 
7: a 1  3 
8: b 1  1 
9: b 0  2 
10: b 0  2 
11: b 0  2 
12: b 1  3 

In den aktuellen Daten einige dieser „grp“ bestimmte Ereignisse eingestellt sind sehr lang und ich brauche sie in kleinere, variabel zu brechen, n - begrenzte Ereignisse. Zum Beispiel meine gewünschte Ausgabe für eine neue Variable „sub.event“ mit n = 2 ist:

> test 
    grp v1 event sub.event 
1: a 1  1   1 
2: a 0  2   2 
3: a 0  2   2 
4: a 1  3   3 
5: a 1  3   3 
6: a 1  3   4 
7: a 1  3   4 
8: b 1  1   1 
9: b 0  2   2 
10: b 0  2   2 
11: b 0  2   3 
12: b 1  3   4 

Ich habe meine Haare wurden herausziehen versucht, einen Weg, um herauszufinden, dies zu tun. Es scheint einfach genug zu sein, dass ich etwas Offensichtliches vermissen muss. Um dies zu erleichtern, können die ursprünglichen Variablen zu neuen Variablen verkettet werden, bevor das "sub.event" definiert wird.

Vielen Dank im Voraus für Ihre Hilfe.

Antwort

3

Hier ist eine Methode, die mit Verkettung funktioniert.

setDT(test)[, new := rep(1:0, length.out=.N), by=.(grp, rleid(v1))][, 
       new := cumsum(new), by=grp] 

die erste Kette gibt einen Vektor von 1en und 0en, die Länge der GRP- rleid Paare wiederholen. Der nächste Link in der Kette fasst dies mit cumsum von grp zusammen.

diese zurück

test 
    grp v1 new 
1: a 1 1 
2: a 0 2 
3: a 0 2 
4: a 1 3 
5: a 1 3 
6: a 1 4 
7: a 1 4 
8: b 1 1 
9: b 0 2 
10: b 0 2 
11: b 0 3 
12: b 1 4 

Beachten Sie, dass als geschrieben, es nicht automatisch auf n erweitern> 2. Sie jedoch, dass das Stück es produziert, 1:0rep(c(1L, rep(0L, n)), length.out=.N) geschrieben werden kann, wo n+1 die Anzahl der wiederholten Werte sind das würdest du wollen.

In diesem Fall würde der Code wie

aussehen
test[, new := rep(c(1L, rep(0L, 2L)), length.out=.N), by=.(grp, rleid(v1))][, 
     new := cumsum(new), by=grp] 
+0

Vielen Dank, heute morgen diese beiden versuchen würde. –

+0

Ich mag diese Bequemlichkeit der Änderung von * n * in diesem Fall. Es löst eine Reihe von Warnungen aus. Ich lerne gerade data.table, aber ich vermute es ist, wenn die Untergruppe "event" nicht durch mein angegebenes "n" teilbar ist und übrig gebliebene Strings verworfen werden? –

+1

Für die Beispieldaten können Sie * n * auf kleinere oder größere Zahlen setzen und sollten keine Warnung erhalten. Ich habe 1, 2 und 12 ohne Probleme ausprobiert. Die endgültige Länge des "rep" -Vektors wird durch "length.out" gesteuert, das auf die Länge der Gruppe eingestellt ist. – lmo

2

Etwas Kreisverkehr:

# make counters within v1, grp 
test[, v0 := rep(1:.N, each=2, length.out=.N), by=.(rleid(grp, v1))] 

# make overall counters 
test[, v := .GRP, by=rleid(grp, v1, v0)] 

# difference per grp 
test[, v := v - first(v) + 1L, by=grp] 

# drop internal counter 
test[, v0 := NULL ] 

    grp v1 v 
1: a 1 1 
2: a 0 2 
3: a 0 2 
4: a 1 3 
5: a 1 3 
6: a 1 4 
7: a 1 4 
8: b 1 1 
9: b 0 2 
10: b 0 2 
11: b 0 3 
12: b 1 4 
+1

Vielen Dank, werde diese beiden heute Morgen versuchen. –

Verwandte Themen