2016-04-17 12 views
0

サブシーケンス(行グループ) を持つデータフレームがあり、これらのサブシーケンスを識別する条件は列diffのサージを監視することです。これは、データがどのように見えるかです:ロールアップ関数を使用した条件付きグループ識別子の追加

> 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") 

私は新しいサブシーケンスが識別された場合を示していると全体のサブシーケンス一意のIDを割り当てます列を追加しようとしています。次の例でグループ化の基準を示します。
行5のdiff値は6829で、その行(283)までの最大値の10倍です。 CUMSUM(DFの$ diffを> 500)+ 1( - 方法についてのdf $グループ<:

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") 

任意の助けも大歓迎

+0

df $ group < - cumsum(df $ diff> 500)+ 1'(指定した基準どおりです)はどうですか? – Gopala

+0

それは動作します!しかし、私は理由を理解していません:-) cumsumはRプロセスの行がさらにdfを下回るほど大きくなっていますか?どのようにこの作品が表示されませんが、それはなかった –

答えて

0

なぜそれが動作し、どのように動作するのかについてもう少し詳しく説明しましょう。

まず、私たちはちょうどcumsum一部せずに列を追加してみましょう。

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 

あなたが見ることができるように、それは単に違いかどうかと言うタグ列でTRUE/FALSE値の論理を作成し、 「十分に大きい」(選択したしきい値に基づいて)

ここでcumsumをその列に入力してgroup列に格納すると、累積加算されます。すべてのTRUE値は累積合計を1だけインクリメントし、すべてのFALSE値はその行がヒットする前と同じ累積合計を保持します。

だから、これはあなたの希望インクリメントgroup値が得られます:

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 

お知らせをグループの値がゼロで始まること。最初のいくつかのFALSE値の累積合計がゼロであるため。しかし、グループ識別子を1から始めることをお勧めします。したがって、私はcumsumに1を追加しましたが、次のように追加のステップとして行うこともできます。

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 

これが役立ちます。

0

ユーザーGopalaの礼儀: 結果は、このDFのようなものでなければなりませんあなたが指定する基準どおり)。 - Gopala 31分前

関連する問題