23

わかりました、立て続けに 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 年間の 1 時間ごとの平均)。

上記の場合、時間などのカテゴリを作成します (たとえばstrptime(data$Timestamp,"%H") -> data$hour、そのカテゴリを で使用してddplyddply(data,"hour", summarize, St_01=mean(St_01), St_02=mean(St_02)...)各列のカテゴリごとに平均化します。

しかし、ここで粘着性が生じます。処理する列が 40 を超えていますが、それらすべてをsummarize関数のパラメーターとして 1 つずつ入力する準備ができていません。このコードを生成するためにシェルでループを書いていましたが、それはプログラマーが問題を解決する方法ではありませんか?

ですから、同じ結果をより少ないキーストロークで達成するためのより良い方法がある人はいますか?

4

2 に答える 2

38

を使用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
于 2012-05-28T16:28:52.353 に答える
7

ddply 呼び出しを完全に省略することで、Andrie によって提案された 2 番目のアプローチを単純化することもできます。meandcast 呼び出しで集計関数として指定するだけです。

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変数は、 で使用されるすべての列を除く、各グループのデータのサブセットを含む特別な data.table 変数ですby

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
于 2014-04-25T14:14:40.830 に答える