2017-12-13 1 views
10

私は、次のデータフレームがあります。それぞれの日にR-一意のIDのみで累積合計を実行するにはどうすればよいですか?

d<-data.frame(Day=c(1, 1, 1, 1, 1, 1, 2), ID=c("A", "B", "C", "D", "A", "B", "B"), Value=c(1, 2, 3, 4, 5, 6, 7)) 

を、私は繰り返されたエントリのための唯一の最新の値を取って、一意の値の累積合計をしたいと思います。次のように私の予想される出力は、次のとおり

d<-data.frame(Day=c(1, 1, 1, 1, 1, 1, 2), ID=c("A", "B", "C", "D", "A", "B", "B"), Value=c(1, 2, 3, 4, 5, 6, 7), Sum=c(1, 3, 6, 10, 14, 18, 7)) 

    Day ID Value Sum 
1 1 A  1 1 
2 1 B  2 3 
3 1 C  3 6 
4 1 D  4 10 
5 1 A  5 14 
6 1 B  6 18 
7 2 B  7 7 

を5番目のエントリは(最大値2、3、4、5(反復ため)及び第6のエントリが最大値3、4、5、及び6加算する加算場合ためAとBの両方が繰り返される)。 7日目のエントリーは、新しい日なので再開します。

私はcumsum()が1つのパラメータしか受け付けないので、私は使うことができません。 1日あたり最大100個のユニークIDを持つ可能性があるため、各IDのカウンタを保持することも望ましくありません。

ヒントや助けていただければ幸いです!ありがとうございました!

答えて

5

あなたは違いその後、IDと昼とによって値がcumsum使用することができます。

library(data.table) 
setDT(d) 
d[, v_eff := Value - shift(Value, fill=0), by=.(Day, ID)] 
d[, s := cumsum(v_eff), by=Day] 

    Day ID Value Sum v_eff s 
1: 1 A  1 1  1 1 
2: 1 B  2 3  2 3 
3: 1 C  3 6  3 6 
4: 1 D  4 10  4 10 
5: 1 A  5 14  4 14 
6: 1 B  6 18  4 18 
7: 2 B  7 7  7 7 

ベースRアナログ...

d$v_eff <- with(d, ave(Value, Day, ID, FUN = function(x) c(x[1], diff(x)))) 
d$s <- with(d, ave(v_eff, Day, FUN = cumsum)) 

    Day ID Value Sum v_eff s 
1 1 A  1 1  1 1 
2 1 B  2 3  2 3 
3 1 C  3 6  3 6 
4 1 D  4 10  4 10 
5 1 A  5 14  4 14 
6 1 B  6 18  4 18 
7 2 B  7 7  7 7 
関連する問題