2016-04-17 29 views
0

Ich habe einen Datenrahmen, der Untersequenzen (Gruppen von Zeilen) hat und die Bedingung, um diese Untersequenzen zu identifizieren, ist für einen Anstieg in der Spalte diff zu beobachten. Dies ist, was die Daten wie folgt aussieht:Hinzufügen bedingten Gruppenkennung mit Rollup-Funktionen

> dput(test) 
structure(list(vid = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
    .Label = "2a38ebc2-dd97-43c8-9726-59c247854df5", class = "factor"), 
    events = structure(c(3L, 2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 
    2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 2L, 4L, 1L), .Label = c("click", 
    "mousedown", "mousemove", "mouseup"), class = "factor"), 
    deltas = structure(6:25, .Label = c("154875", "154878", "154880", 
    "155866", "155870", "38479", "38488", "38492", "38775", "45595", 
    "45602", "45606", "45987", "50280", "50285", "50288", "50646", 
    "54995", "55001", "55005", "55317", "59528", "59533", "59537", 
    "59921", "63392", "63403", "63408", "63822", "66706", "66710", 
    "66716", "67002", "73750", "73755", "73759", "74158", "77999", 
    "78003", "78006", "78076", "81360", "81367", "81371", "82381", 
    "93365", "93370", "93374", "93872"), class = "factor"), 
    serial = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
    19, 20), diff = c(0, 9, 4, 283, 6820, 7, 4, 381, 4293, 5, 3, 358, 4349, 6, 4, 
    312, 4211, 5, 4, 384)), 
    .Names = c("vid", "events", "deltas", "serial", "diff"), 
    row.names = c(NA, 20L), class = "data.frame") 

ich eine Spalte hinzuzufügen, ich versuche, die anzeigen, wann eine neue Sub-Sequenz identifiziert wird und die gesamte Untersequenz eine eindeutige ID zugewiesen werden. Ich werde das Kriterium für die Gruppierung anhand des folgenden Beispiels demonstrieren:
Der Diff-Wert von Zeile 5 ist 6829, was zehnmal höher ist als der Maximalwert bis zu dieser Zeile (283). cumsum (df $ diff> 500) + 1 (- Wie wäre es df $ group <:

structure(list(vid = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
    .Label = "2a38ebc2-dd97-43c8-9726-59c247854df5", class = "factor"), 
    events = structure(c(3L, 2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 
    2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 2L, 4L, 1L), .Label = c("click", 
    "mousedown", "mousemove", "mouseup"), class = "factor"), 
    deltas = structure(6:25, .Label = c("154875", "154878", "154880", 
    "155866", "155870", "38479", "38488", "38492", "38775", "45595", 
    "45602", "45606", "45987", "50280", "50285", "50288", "50646", 
    "54995", "55001", "55005", "55317", "59528", "59533", "59537", 
    "59921", "63392", "63403", "63408", "63822", "66706", "66710", 
    "66716", "67002", "73750", "73755", "73759", "74158", "77999", 
    "78003", "78006", "78076", "81360", "81367", "81371", "82381", 
    "93365", "93370", "93374", "93872"), class = "factor"), serial = c(1, 
    2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
    19, 20), 
    diff = c(0, 9, 4, 283, 6820, 7, 4, 381, 4293, 5, 
    3, 358, 4349, 6, 4, 312, 4211, 5, 4, 384), 
    group = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5)), 
    .Names = c("vid", "events", "deltas", "serial", "diff", "group"), 
    row.names = c(NA, 20L), class = "data.frame") 

Jede Hilfe sehr geschätzt

+0

Wie wäre es mit 'df $ group <- cumsum (df $ diff> 500) + 1' (Ihr beliebiges Kriterium, das Sie angeben). – Gopala

+0

Es funktioniert! aber ich verstehe nicht warum :-) das cumsum wird nur größer als R prozess reihe weiter unten am df?! Ich verstehe nicht, wie das funktioniert, aber es hat funktioniert –

Antwort

0

Lassen Sie mich Ihnen ein bisschen genauer erklären, warum es funktioniert und wie es funktioniert.

Zuerst wollen wir fügen Sie einfach eine Spalte ohne cumsum Teil:

df$tag <- df$diff > 500 
head(df) 
            vid events deltas serial diff tag 
1 2a38ebc2-dd97-43c8-9726-59c247854df5 mousemove 38479  1 0 FALSE 
2 2a38ebc2-dd97-43c8-9726-59c247854df5 mousedown 38488  2 9 FALSE 
3 2a38ebc2-dd97-43c8-9726-59c247854df5 mouseup 38492  3 4 FALSE 
4 2a38ebc2-dd97-43c8-9726-59c247854df5  click 38775  4 283 FALSE 
5 2a38ebc2-dd97-43c8-9726-59c247854df5 mousemove 45595  5 6820 TRUE 
6 2a38ebc2-dd97-43c8-9726-59c247854df5 mousedown 45602  6 7 FALSE 

Wie man sehen kann, schafft es einfach eine logische WAHR/FALSCH-Werte in der Tag-Spalte, ob sagt oder nicht die Differenz ist 'groß genug' (basierend auf dem ausgewählten Schwellenwert).

Jetzt, wenn Sie cumsum auf dieser Spalte tun und es in group Spalte speichern, wird es kumulativ hinzufügen. Jeder TRUE-Wert erhöht die kumulative Summe um 1, und jeder FALSE-Wert behält die kumulative Summe bei, die vor dem Treffer der Zeile vorlag.

Also, dies wird Ihnen die gewünschten Inkrementieren group Werte:

df$group <- cumsum(df$tag) 
head(df) 
            vid events deltas serial diff tag group 
1 2a38ebc2-dd97-43c8-9726-59c247854df5 mousemove 38479  1 0 FALSE  0 
2 2a38ebc2-dd97-43c8-9726-59c247854df5 mousedown 38488  2 9 FALSE  0 
3 2a38ebc2-dd97-43c8-9726-59c247854df5 mouseup 38492  3 4 FALSE  0 
4 2a38ebc2-dd97-43c8-9726-59c247854df5  click 38775  4 283 FALSE  0 
5 2a38ebc2-dd97-43c8-9726-59c247854df5 mousemove 45595  5 6820 TRUE  1 
6 2a38ebc2-dd97-43c8-9726-59c247854df5 mousedown 45602  6 7 FALSE  1 

Beachten Sie, dass die Gruppenwert bei Null beginnt. Da die kumulative Summe der ersten paar FALSE-Werte Null ist. Möglicherweise möchten Sie jedoch, dass Ihre Gruppenbezeichner mit 1 beginnen. Also habe ich eine 1 zu der cumsum hinzugefügt, aber Sie können es auch wie folgt als einen zusätzlichen Schritt tun.

df$group <- df$group + 1 
head(df) 
            vid events deltas serial diff tag group 
1 2a38ebc2-dd97-43c8-9726-59c247854df5 mousemove 38479  1 0 FALSE  1 
2 2a38ebc2-dd97-43c8-9726-59c247854df5 mousedown 38488  2 9 FALSE  1 
3 2a38ebc2-dd97-43c8-9726-59c247854df5 mouseup 38492  3 4 FALSE  1 
4 2a38ebc2-dd97-43c8-9726-59c247854df5  click 38775  4 283 FALSE  1 
5 2a38ebc2-dd97-43c8-9726-59c247854df5 mousemove 45595  5 6820 TRUE  2 
6 2a38ebc2-dd97-43c8-9726-59c247854df5 mousedown 45602  6 7 FALSE  2 

Hoffnung, das hilft.

0

mit freundlicher Genehmigung des Benutzers Gopala: Das Ergebnis sollte so etwas wie dieses df sein Ihre von Ihnen angegebenen Kriterien). - Gopala 31 minutes ago