2016-10-05 10 views
1

私は連続した観測のランを特定し、それらをグループ化して再構成して、各ランの開始と終了が列を占めるようにしようとしています。視覚的に次のようにグループと形による連続したオブセッションの実行

Example

## REPRODUCIBLE EXAMPLE 
> dput(example) 
structure(list(id = c(123, 123, 123, 123, 123, 123, 123, 123, 
234, 234, 234), date = structure(c(1398816000, 1398902400, 1398988800, 
1399075200, 1399161600, 1350777600, 1350864000, 1350950400, 1470009600, 
1470096000, 1470182400), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    event = structure(c(1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 
    1L), .Label = c("0", "1"), class = "factor")), row.names = c(NA, 
-11L), .Names = c("id", "date", "event"), class = c("tbl_df", 
"tbl", "data.frame")) 

## GLIMPSE DATA 
> dplyr::glimpse(example) 
Observations: 11 
Variables: 3 
$ id <dbl> 123, 123, 123, 123, 123, 123, 123, 123, 234, 234, 234 
$ date <dttm> 2014-04-30, 2014-05-01, 2014-05-02, 2014-05-03, 2014-05-04, 2012-10-21, 2012-10-22, 2012-10-23, 2016-08-01, 2016-08-02, 2016-08-03 
$ event <fctr> 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0 

私はアプローチを分解しました:id内の連続観測 のランを識別するためのid

  • rleによって

    1. グループのデータは(例えばrle(example$event > 0)
    2. res (実行中の)min(日付)とmax(日付)が列になるような、長いから長い間の変化を示します。

    私はどのように進むべきかわかりません。 similar questionへのdata.tableの解決策は近いですが、私はそれを再利用することができませんでした。 other postからアイデアを盗む

  • +0

    グループIDによっては、ソート日付で、event.start分間の日付を取得するには、イベントの最大の日付を取得します。やめる。 – zx8754

    +0

    ああ、1人のIDに1つ以上の開始終了イベントがあるということですか? – zx8754

    +0

    @ zx8754 **はい**:IDごとに複数の実行があるため、開始日と終了日が複数になります。私の最小限の例はそれを捕らえなかった。 –

    答えて

    1

    df1 %>% 
        mutate(eventGroup = data.table::rleid(event)) %>% 
        filter(event == 1) %>% 
        group_by(id, eventGroup) %>% 
        summarise(start = min(date), 
          end = max(date)) 
    
    #  id eventGroup  start  end 
    # 1 123   2 2014-05-01 2014-05-03 
    # 2 123   4 2012-10-22 2012-10-22 
    # 3 234   6 2016-08-02 2016-08-02 
    
    +0

    ありがとうございました!これは素晴らしく、私は個人的にはちょっとしたデータテーブルを使って整然としたアプローチが好きです! –

    +0

    @ThomasSpeidelいくつかの人は、この醜い、1つの生態系に固執する方が良いかもしれません。 – zx8754

    1

    ここでは別のオプションです:

    library(data.table) 
    setDT(ex)[,rl:=rleid(event),by=id][event=="1",.(start=min(date),stop=max(date)),by="id,rl"][,rl:=NULL][] 
    #  id  start  stop 
    # 1: 123 2014-05-01 2014-05-03 
    # 2: 123 2012-10-22 2012-10-22 
    # 3: 234 2016-08-02 2016-08-02 
    
    関連する問題