場所、時間、値 (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
。
いくつかのテスト データを設定します。
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))
あなたが何を望んでいるのか理解できたと思います:
library(plyr)
ddply(df, .(P,T), summarize, cumsum(X))
これは役に立ちますか?
または、別のオプションは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
>