web-dev-qa-db-ja.com

ddply +要約して、多数の列にわたって同じ統計関数を繰り返す

では、続けて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 ...
...
_

基本的に通常、私はddplysummarizeの組み合わせを使用してアンサンブルを計算します(例:通年の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つずつ入力する準備ができていません。以前はシェルでループを作成してこのコードを生成していましたが、プログラマーが問題を解決する方法ではありませんか?

だから祈ってください、誰かが同じ結果を達成するより良い方法を持っていますが、より少ないキーストロークで?

23
Reuben L.

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
_
38
Andrie

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
7
alex23lemm