私は、さまざまなソースによって取得された、複数の場所の温度の月次測定値を含むRの巨大なデータテーブルを使用しています。
データセットは次のようになります。
library(data.table)
# Generate random data:
loc <- 1:10
dates <- seq(as.Date("2000-01-01"), as.Date("2004-12-31"), by="month")
mods <- c("A","B", "C", "D", "E")
temp <- runif(length(loc)*length(dates)*length(mods), min=0, max=30)
df <- data.table(expand.grid(Location=loc,Date=dates,Model=mods),Temperature=temp)
つまり、基本的に、ロケーション1については、モデルAで2000年1月から2004年12月までの測定を行います。次に、モデルBで測定を行います。モデルC、D、およびEについても同様です。次に、ロケーション2についても同様です。場所10へ。
私がする必要があるのは、(モデルからの)5つの異なる温度測定を行う代わりに、すべてのモデルの平均温度を取得することです。
その結果、場所ごと、日付ごとに、5つではなく、1つだけの温度測定値が得られます(これはマルチモデル平均になります)。
私はこれを試しました:
df2 <- df[, Mean:=mean(Temperature), by=list(Model, Location, Date)]
思ったように動作しませんでした。5つの測定値を1つの測定値に要約しているので、少なくとも、結果のデータテーブルは元のテーブルの行数の1/5になると思います。
私は何が間違っているのですか?
テストデータが正しく生成されていないと思います。この関数expand.grid()
は、すべての引数のデカルト積を取ります。なぜあなたがそのTemperature=temp
議論をexpand.grid()
呼びかけに含めたのかわかりません。これにより、キーの組み合わせごとに各温度値が複製され、900万行のdata.tableが作成されます(これは(10*60*5)^2
)。キーごとに1つの温度値を意図したと思います。これにより、次の10*60*5
行が表示されます。
df <- data.table(expand.grid(Location=loc,Date=dates,Model=mods),Temperature=temp);
df;
## Location Date Model Temperature
## 1: 1 2000-01-01 A 2.469751
## 2: 2 2000-01-01 A 16.103135
## 3: 3 2000-01-01 A 7.147051
## 4: 4 2000-01-01 A 10.301937
## 5: 5 2000-01-01 A 16.760238
## ---
## 2996: 6 2004-12-01 E 26.293968
## 2997: 7 2004-12-01 E 8.446528
## 2998: 8 2004-12-01 E 29.003001
## 2999: 9 2004-12-01 E 12.076765
## 3000: 10 2004-12-01 E 28.410980
これが正しければ、次の方法でモデル全体の平均を生成できます。
df[,.(Mean=mean(Temperature)),.(Location,Date)];
## Location Date Mean
## 1: 1 2000-01-01 9.498497
## 2: 2 2000-01-01 11.744622
## 3: 3 2000-01-01 15.691228
## 4: 4 2000-01-01 11.457154
## 5: 5 2000-01-01 8.897931
## ---
## 596: 6 2004-12-01 17.587000
## 597: 7 2004-12-01 19.555963
## 598: 8 2004-12-01 15.710465
## 599: 9 2004-12-01 15.322790
## 600: 10 2004-12-01 20.240392
:=
演算子は実際には集計されないことに注意してください。元のdata.tableの列を追加、変更、または削除するだけです。集計された計算の重複で新しい列を追加する(または古い列を上書きする)ことができます(例:http://www.r-bloggers.com/two-of-my-favorite-data-table-features/を参照))、しかしそれはあなたが望むものではありません。
一般に、データのテーブルを集約する場合、必然的に、集約キーごとに1行に削減される新しいテーブルを作成することになります。:=
オペレータは、これを実行しません。
代わりに、data.tableで通常のインデックス操作を実行し、必要な集計キー(出力data.tableに自動的に含まれる)でグループ化し、それにj
各グループに対して1回評価される引数を追加する必要があります。 。結果は元のテーブルの縮小版になり、すべてのj
引数評価の結果がそれぞれの集計キーにマージされます。私達のためj
各群のスカラー値で引数結果、我々の結果は、一列あたりであろうLocation
/Date
凝集キー。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加