3

場所、時間、値 (P、T、X) の 3 つの変数を持つデータ フレームがあります。X の累積合計となる 4 番目の変数を作成したいと考えていsqldfますcumsum。あれは:

sqldf("select P,T,X, cumsum(X) as X_CUM from df group by P,T") 

動作しません。これは可能sqldfですか?試してみdoByましたが、それだけではありませんcumsum

4

3 に答える 3

9

いくつかのテスト データを設定します。

DF <- data.frame(t = 1:4, p = rep(1:3, each = 4), value = 1:12)

そして今、3つの解決策があります。最初に、デフォルトの SQLite データベースを使用して、要求に応じてsqldfを使用します。次に再び sqldf を使用しますが、今回は RPostgreSQL または RpgSQL ドライバーを使用して PostgreSQL を使用ます。PostgreSQL は、SQL を簡素化する分析ウィンドウ関数をサポートしています。そのためには、最初に PostgreSQL データベースをセットアップする必要があります。最後に、R のコアのみを使用する純粋な R ソリューションを示します。

1) sqldf/RSQLite

library(sqldf)

sqldf("select a.*, sum(b.value) as cumsum 
    from DF a join DF b 
    using (p)
    where a.t >= b.t
    group by p, a.t"
)

2) sqldf/RPostgreSQL

library(RPostgreSQL)
library(sqldf)

sqldf('select *,
    sum(value) over (partition by p order by t) as cumsum 
    from "DF"'
)

(これは、RpgSQL PostgreSQL ドライバーでも機能します。これを使用するには、Java をインストールし、PostgreSQL データベースをセットアップする必要があります。次に、上記の使用の代わりに、1ibrary(RpgSQL); sqldf(...)引用符を使用しないことを除いて、同じ SQL 文字列を使用しますDF。)

3) 無地R

transform(DF, cumsum = ave(value, p, FUN = cumsum))
于 2011-12-19T12:23:27.207 に答える
1

あなたが何を望んでいるのか理解できたと思います:

library(plyr)
ddply(df, .(P,T), summarize, cumsum(X))

これは役に立ちますか?

于 2011-12-19T11:27:02.023 に答える
1

または、別のオプションはdata.tableです。

> library(data.table)
> DT = data.table(place = 1:4, time = rep(1:3, each = 4), value = 1:3)
> setkey(DT,place,time)   # order by place and time
> DT
      place time value
 [1,]     1    1     1
 [2,]     1    2     2
 [3,]     1    3     3
 [4,]     2    1     2
 [5,]     2    2     3
 [6,]     2    3     1
 [7,]     3    1     3
 [8,]     3    2     1
 [9,]     3    3     2
[10,]     4    1     1
[11,]     4    2     2
[12,]     4    3     3
> DT[,list(time,value,cumsum(value)),by=place]
      place time value V3
 [1,]     1    1     1  1
 [2,]     1    2     2  3
 [3,]     1    3     3  6
 [4,]     2    1     2  2
 [5,]     2    2     3  5
 [6,]     2    3     1  6
 [7,]     3    1     3  3
 [8,]     3    2     1  4
 [9,]     3    3     2  6
[10,]     4    1     1  1
[11,]     4    2     2  3
[12,]     4    3     3  6
> 
于 2011-12-20T17:03:39.393 に答える