2016-11-17 12 views
0

私は以前、別の変数の変更ごとに値がインクリメントされたベクトルを返すことができる非常に便利なr関数を使用しました。私はその遅れ値でbitを比較するソリューションを持っているbit.changeベクトルの値の変更を確認する

Day   bit bit.change 
2016-10-01 1 1 
2016-10-02 0 2 
2016-10-03 0 2 
2016-10-04 1 3 
2016-10-05 1 3 
2016-10-06 0 4 
2016-10-07 1 5 
2016-10-08 1 5 
2016-10-09 1 5 
2016-10-10 1 5 

余分な列が必要になります

set.seed(0) data.frame(Day=seq(as.Date("2016-10-01"),as.Date("2016-10-10"),by="day"), bit=sample(c(0,1),size=10,replace=TRUE))

Day   bit 
2016-10-01 1 
2016-10-02 0 
2016-10-03 0 
2016-10-04 1 
2016-10-05 1 
2016-10-06 0 
2016-10-07 1 
2016-10-08 1 
2016-10-09 1 
2016-10-10 1 

: は、ここに以下のコードを生成し、私の入力data.frameだろうそれはエレガントではありません。 誰かが何を意味するのか分かりませんか? 可能であれば、dplyr::mutate()dplyr::group_by()で動作するはずです。 group_by()が指定されている場合は、新しいグループごとにbit.change1から再び開始されます。 Thxあなたの助けにたくさん!

+0

このような実装では、 'data.table'の' rleid() 'を参照してください。私はこれが重複した質問だと確信していますが、 'cumsum(abs(c(1、diff(df $ bit))))')も基底Rで行います。 – thelatemail

+0

Thx。 'rleid()'は私が探していたものでした。 Thxは 'cumsum()'の代替提案にも – Vincent

答えて

0
df %>% 
    mutate(bit.change=cumsum(c(1, diff(bit) != 0))) 

      Day bit bit.change 
1 2016-10-01 1   1 
2 2016-10-02 0   2 
3 2016-10-03 0   2 
4 2016-10-04 1   3 
5 2016-10-05 1   3 
6 2016-10-06 0   4 
7 2016-10-07 1   5 
8 2016-10-08 1   5 
9 2016-10-09 1   5 
10 2016-10-10 1   5 
関連する問題