1

次のデータフレームがあります。

id<-c(1,1,1,1,1,3,3,3,3)
spent<-c(10,20,30,40,50,60,70,80,90)
date<-c("11-11-07","11-11-07","23-11-07","12-12-08","17-12-08","11-11-07","23-11-07","23-   11-07","16-01-08")
df<-data.frame(id,date,spent)
df$date2<-as.Date(as.character(df$date), format = "%d-%m-%y")


 id     date spent      date2
1  1 11-11-07    10 2007-11-11
2  1 11-11-07    20 2007-11-11
3  1 23-11-07    30 2007-11-23
4  1 12-12-08    40 2008-12-12
5  1 17-12-08    50 2008-12-17
6  3 11-11-07    60 2007-11-11
7  3 23-11-07    70 2007-11-23
8  3 23-11-07    80 2007-11-23
9  3 16-01-08    90 2008-01-16

spent1 日ごとに合計を計算し、id次のようにフレームワークに含める必要があります。

 id     date spent      date2    sum.spent
1  1 11-11-07    10 2007-11-11    10
2  1 11-11-07    20 2007-11-11    30 
3  1 23-11-07    30 2007-11-23    30
4  1 12-12-08    40 2008-12-12    40
5  1 17-12-08    50 2008-12-17    50
6  3 11-11-07    60 2007-11-11    60
7  3 23-11-07    70 2007-11-23    70
8  3 23-11-07    80 2007-11-23    150
9  3 16-01-08    90 2008-01-16    90 

次のスクリプトはうまく機能します (大したことではない最初の行を除いて)。

df$spent2<-NA
for (a in 2:9)
if (df[a,1]==df[a-1,1]&& df[a,4]==df[a-1,4])
(df[a,5]=df[a,3]+df[a-1,3])else(df[a,5]=df[a,3])

ただし、実際のデータセットの行数は約 150 万であるため、上記のスクリプトの実行には約 5 日かかります。このコードを記述して同じ目的を達成するためのより効率的な方法を提案していただけないでしょうか。

4

2 に答える 2

6

data.table特にそのような大規模なデータセットの場合、かなり高速です。これは、1.5 ミルのレコードではかなり速く実行されるはずです。

library(data.table)
df <- data.table(df)
df <- df[, sum.spent:=cumsum(spent), by = list(id, date2)]
于 2012-10-26T06:39:37.330 に答える
3

基本的な R ソリューションは次のとおりです。

df$sum.spent <- ave(df$spent,df$id,df$date2,FUN=cumsum)

予想と違う結果になってしまいましたが、正解でしょうか?

于 2012-10-26T06:50:12.253 に答える