多数の列にわたって同じ統計関数を繰り返すためのddply + summary 質問する

多数の列にわたって同じ統計関数を繰り返すためのddply + summary 質問する

さて、R に関する 2 番目の質問を立て続けに。

私のデータ:

           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、そのカテゴリを で使用してddplyddply(data,"hour", summarize, St_01=mean(St_01), St_02=mean(St_02)...)各列のカテゴリごとに平均化します。

しかし、ここで問題が起こります。処理する列が 40 個以上あり、関数のパラメータとして 1 つずつすべてを入力する準備ができていません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

おすすめ記事