さて、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
、そのカテゴリを で使用してddply
、ddply(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