2017-11-13 16 views
2

条件に合致する観測値(バイナリフラグ)を特定の日付に、フラグに一致する日付範囲の観測テーブルに変換する必要があります。連続した日付の行を日付範囲の列に変換する

サンプル・データは、次のようになります。

id <- c(1001, 1001, 1001, 1002, 1002, 1002, 1003, 1003, 1003) 
date <- c("2016-06-20", "2016-06-21", "2016-06-22", "2016-06-20", 
      "2016-06-21", "2016-06-22", "2016-06-20", "2016-06-21", 
      "2016-06-22") 
flag <- c(1, 0, 0, 1, 1, 0, 1, 0, 1) 
mydata <- data.frame(id, date, flag) 

    id  date flag 
1001 2016-06-20 1 
1001 2016-06-21 0 
1001 2016-06-22 0 
1002 2016-06-20 1 
1002 2016-06-21 1 
1002 2016-06-22 0 
1003 2016-06-20 1 
1003 2016-06-21 0 
1003 2016-06-22 1 

私は2つのステップのプロセスとしてこれを考えています。

ステップ1:フラグが連続した日に発生するかどうかを判断します。

これはこの質問に似ています - R, find, dates, consecutive - 条件付き、flag > 0の場合。私は解決策を適用しようとしますが、それは全く同じように動作しません。

mydata$flag_consecutive <- mydata$flag > 0 & c(NA, diff(as.Date(mydata$date)) == 1) 


    id  date flag flag_consecutive 
1001 2016-06-20 1    NA 
1001 2016-06-21 0   FALSE 
1001 2016-06-22 0   FALSE 
1002 2016-06-20 1   FALSE 
1002 2016-06-21 1    TRUE 
1002 2016-06-22 0   FALSE 
1003 2016-06-20 1   FALSE 
1003 2016-06-21 0   FALSE 
1003 2016-06-22 1    TRUE 

ステップ2:作成した日付範囲の列

私はフラグが1日だけ、開始日と終了日に発生した場合はR. にベクトル化してこの部分にアプローチするかどうかはわかりません同じだ。 フラグが連続した日に発生した場合は、シーケンスの最初の日をdate_start、最後の日をdate_endとします。フラグが発生していない場合は、データセットからそのフラグを削除します。私は生成したいのですがどのような

は、この方法でフォーマットされたデータである:あなたがステップ1またはステップ2上の任意のガイダンスを提供できる場合

id flag date_start  date_end 
1001 1 2016-06-20 2016-06-20 
1002 1 2016-06-20 2016-06-21 
1003 1 2016-06-20 2016-06-20 
1003 1 2016-06-22 2016-06-22 

、私は非常に感謝しています。私はサークルで考えており、ステップ1が必要かどうかはわかりません。

答えて

2

data.table -package使用可能な解決策:

library(data.table) 
setDT(mydata)[, rl := rleid(flag) 
       ][flag == 1 
       , .(date_start = first(date), date_end = last(date)) 
       , by = .(id, rl, flag) 
       ][, rl := NULL][] 

います:

 id flag date_start date_end 
1: 1001 1 2016-06-20 2016-06-20 
2: 1002 1 2016-06-20 2016-06-21 
3: 1003 1 2016-06-20 2016-06-20 
4: 1003 1 2016-06-22 2016-06-22 

が、これは何:

  • rl := rleid(flag)は、グループ化vを作成し、 flag == 1
  • `=による有するグループとflag S
  • フィルタの各連続する行のariable rl(ID、RL、フラグ)
  • .(date_start = first(date), date_end = last(date))と各グループの最初と最後の観察を選択。値が1つだけの場合はfirstlastがその値を選択します。

dplyrと同等のアプローチ:

library(dplyr) 
mydata %>% 
    mutate(rl = cumsum(flag != lag(flag, default = 1))) %>% 
    filter(flag == 1) %>% 
    group_by(id, flag, rl) %>% 
    summarise(date_start = first(date), 
      date_end = last(date)) %>% 
    select(-rl) 
関連する問題