2

私はRを初めて使用し(以前にMATLABを使用したことがあります)、これに対する解決策を長い間探してきましたが、この(一見)非常に簡単な問題に対する解決策を見つけることができません。ここに問題があります。

最初の列には、数日間の時間の値 (この例では単純化されています) があり、2 番目の列には、平均したい値があります。私がやりたいことは、同じ時間に属するすべての値を取得し、それを平均することです。私はかなり大きなデータセットに対してこれを行っているので、これを自動的に行うと非常に役立ちます。

セットアップしましょう:

time = rep( c("00:00", "00:10", "00:20", "00:30", "00:40", "00:50", "01:00", "01:10"), 5)
values = c(sample(1:100, 40))
data = cbind(time, values)

これで、時間と値を含むマトリックスができました。(たとえば)「00:00」を持つすべての値をグループ化し、この平均を計算したいと思います。いくつかの検索の後、aggregate()関数がうまく役立つことがわかったので、次のことを行いました。

aggregate(as.numeric(data[,-1]), by = list(sort(data[,1])), mean) 

出力がある

    Group.1    x
1   00:00 77.2
2   00:10 59.2
3   00:20 51.0
4   00:30 49.4
5   00:40 51.4
6   00:50 33.4
7   01:00 33.8
8   01:10 51.6

うまく機能しているように見えますが、手で計算すると、値の平均はすべて異なります。(たとえば、00:00 の場合: (56+3+91+71+8)/5 = 45.8 であり、77.2 ではありません)、誰かが私が間違っていることを教えてもらえますか?

4

3 に答える 3

2

@joranの提案(by変数を並べ替えてスクランブルしないでください)はうまくいくようです:

set.seed(101) ## for reproducibility
time = rep( c("00:00", "00:10", "00:20", "00:30", 
      "00:40", "00:50", "01:00", "01:10"), 5)
values = c(sample(1:100, 40))
data = cbind(time, values)
aggregate(as.numeric(data[,2]),by=list(factor(data[,1])), mean)
##   Group.1    x
## 1   00:00 50.0
## 2   00:10 29.0
## 3   00:20 45.0
## 4   00:30 60.2
## 5   00:40 48.8
## 6   00:50 57.2
## 7   01:00 37.2
## 8   01:10 56.2
##

最初のグループを確認します。

mean(as.numeric(data[data[,1]=="00:00","values"]))
## [1] 50

さらなる推奨事項として、列を ing するのではなく使用することを強くお勧めします。これにより、時間と数値をすべて同じ型に強制することなくまとめることができます。data.framecbind()

(組み込みの times オブジェクトも使用するとよいでしょう。パッケージtimesから試してみましたが、chronコツがつかめませんでした)

dat <- data.frame(time,values)  ## avoid using "data" as a variable name
aggregate(values~time, data=dat, mean)

はるかに読みやすいです。

ところで、集計のさまざまなソリューションを比較するスタック オーバーフローに関する多くの投稿があります (パッケージのbyaggregateddplyおよび友人plyr、およびdata.tableパッケージ): たとえば、集計を使用して ddply タスクを解決するエレガントな方法 (パフォーマンスの向上を期待)R: 「グループ化」操作の高速化、要約とddplyを高速化するには? ...

于 2012-11-28T15:55:29.317 に答える
1

byあなたの友達です:

by(as.numeric(data[,"values"]),data[,"time"],mean)
于 2012-11-28T15:31:49.787 に答える
0

を使用して、係数としてインデックス変数(時間)を設定することをお勧めしますas.factor()

次に、それをインデックスとして使用します。aggregate(data$values,by=list(data$time.factor),FUN=mean)

于 2012-11-28T14:36:40.577 に答える