では、続けて2つ目のRの質問です。
私のデータ:
_ Timestamp St_01 St_02 ...
1 2008-02-08 00:00:00 26.020 25.840 ...
2 2008-02-08 00:10:00 25.985 25.790 ...
3 2008-02-08 00:20:00 25.930 25.765 ...
4 2008-02-08 00:30:00 25.925 25.730 ...
5 2008-02-08 00:40:00 25.975 25.695 ...
...
_
基本的に通常、私はddply
とsummarize
の組み合わせを使用してアンサンブルを計算します(例:通年の1時間ごとの平均)。
上記の場合、カテゴリを作成します。時間(たとえば、strptime(data$Timestamp,"%H") -> data$hour
を使用し、ddply
でそのカテゴリを使用します。たとえば、ddply(data,"hour", summarize, St_01=mean(St_01), St_02=mean(St_02)...)
のように、各列のカテゴリごとに平均化します。
しかし、ここがベタつく場所です。処理する列が40列以上あり、summarize
関数のパラメーターとして1つずつ入力する準備ができていません。以前はシェルでループを作成してこのコードを生成していましたが、プログラマーが問題を解決する方法ではありませんか?
だから祈ってください、誰かが同じ結果を達成するより良い方法を持っていますが、より少ないキーストロークで?
numcolwise()
を使用して、すべての数値列に対して集計を実行できます。
iris
の使用例を次に示します。
_ddply(iris, .(Species), numcolwise(mean))
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 5.006 3.428 1.462 0.246
2 versicolor 5.936 2.770 4.260 1.326
3 virginica 6.588 2.974 5.552 2.026
_
同様に、すべてのカテゴリー列を要約するcatcolwise()
があります。
ヘルプと例については、_?numcolwise
_を参照してください。
[〜#〜]編集[〜#〜]
別のアプローチは、_reshape2
_を使用することです(@ gsk3によって提案されます)。これは、この例ではより多くのキーストロークを備えていますが、非常に柔軟性があります。
ライブラリ(reshape2)
_miris <- melt(iris, id.vars="Species")
x <- ddply(miris, .(Species, variable), summarize, mean=mean(value))
dcast(x, Species~variable, value.var="mean")
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 5.006 3.428 1.462 0.246
2 versicolor 5.936 2.770 4.260 1.326
3 virginica 6.588 2.974 5.552 2.026
_
Andrieが提案した2番目のアプローチは、ddply呼び出しを完全に省略することで簡略化することもできます。 dcast呼び出しの集計関数としてmean
を指定するだけです。
library(reshape2)
miris <- melt(iris, id.vars="Species")
dcast(miris, Species ~ variable, mean)
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 5.006 3.428 1.462 0.246
2 versicolor 5.936 2.770 4.260 1.326
3 virginica 6.588 2.974 5.552 2.026
同じ結果は、data.table
パッケージを使用して非常に高速に計算することもできます。 j式の.SD
変数は、by
で使用されるすべての列を除く、各グループのデータのサブセットを含む特別なdata.table変数です。
library(data.table)
dt_iris <- as.data.table(iris)
dt_iris[, lapply(.SD, mean), by = Species]
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1: setosa 5.006 3.428 1.462 0.246
2: versicolor 5.936 2.770 4.260 1.326
3: virginica 6.588 2.974 5.552 2.026
さらに別のオプションは、Hadleyのdplyr
パッケージの新しいバージョン0.2です。
library(dplyr)
group_by(iris, Species) %>% summarise_each(funs(mean))
Source: local data frame [3 x 5]
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 5.006 3.428 1.462 0.246
2 versicolor 5.936 2.770 4.260 1.326
3 virginica 6.588 2.974 5.552 2.026