r - 集計 - データ通信量とは




1分間のデータを5分間の平均データに集計する (2)

ここで私の質問は、1分ごとに収集されたデータを5分平均に集計することです。

DeviceTime         Concentration
6/20/2013 11:13       
6/20/2013 11:14
6/20/2013 11:15
6/20/2013 11:16
6/20/2013 11:17
6/20/2013 11:18
6/20/2013 11:19
6/20/2013 11:20
6/20/2013 11:21
6/20/2013 11:22
6/20/2013 11:23
6/20/2013 11:24
6/20/2013 11:25
6/20/2013 11:26
6/20/2013 11:27
6/20/2013 11:28

...

私が望む結果は次のようなものです:

DeviceTime             Concentration
6/20/2013 11:15
6/20/2013 11:20
6/20/2013 11:25
6/20/2013 11:30
6/20/2013 11:35
...

5分間の平均値は、過去5分間の濃度に対する単純平均値にすぎません。


dplyrパッケージを使用し、データがdfという名前のデータフレームに格納されていると仮定します。

require(dplyr)
df %>%
  group_by(DeviceTime = cut(DeviceTime, breaks="5 min")) %>%
  summarize(Concentration = mean(Concentration))

あなたのデータが素晴らしい5分の壁時計の境界線から始まらない場合(サンプルデータ - 11:13に示されているように)、 cut()は見つかった最初のタイムスタンプに基づいてブレークポイントを作成します。 これはおそらく私たちが通常望むものではありません。 確かに、サンプル出力はこれがあなたが望むものではないことを示しています。

cut()は次のようになります。

df <- read.table(header=TRUE, sep=",", stringsAsFactors=FALSE, text="
DeviceTime,Concentration
6/20/2013 11:13,1
6/20/2013 11:14,1
6/20/2013 11:15,2
6/20/2013 11:16,2
6/20/2013 11:17,2
6/20/2013 11:18,2
6/20/2013 11:19,2
6/20/2013 11:20,3
6/20/2013 11:21,3
6/20/2013 11:22,3
6/20/2013 11:23,3
6/20/2013 11:24,3
6/20/2013 11:25,4")
df$DeviceTime <- as.POSIXct(df$DeviceTime, format="%m/%d/%Y %H:%M")

cut(df$DeviceTime, breaks="5 min")
 [1] 2013-06-20 11:13:00 2013-06-20 11:13:00 2013-06-20 11:13:00
 [4] 2013-06-20 11:13:00 2013-06-20 11:13:00 2013-06-20 11:18:00
 [7] 2013-06-20 11:18:00 2013-06-20 11:18:00 2013-06-20 11:18:00
[10] 2013-06-20 11:18:00 2013-06-20 11:23:00 2013-06-20 11:23:00
[13] 2013-06-20 11:23:00

means <- aggregate(df["Concentration"], 
                   list(fiveMin=cut(df$DeviceTime, "5 mins")),
                   mean)
means
              fiveMin Concentration
1 2013-06-20 11:13:00      1.600000
2 2013-06-20 11:18:00      2.600000
3 2013-06-20 11:23:00      3.333333

平均の最初の行(11:13:00のエントリ)は、11時13分から11時17分の時間を持つdf最初の5行の平均です。つまり、次のカット/ブレークポイントは11:18です。

cut()を使用すると、dplyr(つまり、@ lukeAの答え)と同じ結果が得られます。

df %>%
  group_by(DeviceTime = cut(DeviceTime, breaks="5 min")) %>%
  summarize(Concentration = mean(Concentration))
Source: local data frame [3 x 2]

           DeviceTime Concentration
1 2013-06-20 11:13:00      1.600000
2 2013-06-20 11:18:00      2.600000
3 2013-06-20 11:23:00      3.333333

xtsパッケージは壁時計の時間によって壊れているようです:

require(xts)
df.xts <- xts(df$Concentration, df$DeviceTime)
means.xts <- period.apply(df.xts, endpoints(df.xts, "mins", k=5), mean)
means.xts
                    [,1]
2013-06-20 11:14:00    1
2013-06-20 11:19:00    2
2013-06-20 11:24:00    3
2013-06-20 11:25:00    4

時刻の値は、常に5分のウィンドウで最後に見つかった時刻です。 ピリオドの終了時刻をレポートする場合は、次の5分の境界をalign.time()align.time()します。

means.rounded <- align.time(means.xts, 5*60)
means.rounded
                    [,1]
2013-06-20 11:15:00    1
2013-06-20 11:20:00    2
2013-06-20 11:25:00    3
2013-06-20 11:30:00    4

また、期間の開始時刻を報告する場合は、切り捨てることもできます。 しかし、まずあなた自身の関数を定義する必要があります(これはCross Validatedで見つけました):

align.time.down = function(x,n) {
    index(x) = index(x) - n
    align.time(x,n)
}
means.rounded.down <- align.time.down(means.xts, 5*60)
means.rounded.down
                    [,1]
2013-06-20 11:10:00    1
2013-06-20 11:15:00    2
2013-06-20 11:20:00    3
2013-06-20 11:25:00    4

xtsパッケージを使用せず、 floor()使用する別の解決策は、次のとおりです。

df$DeviceTimeFloor <- as.POSIXct(floor(as.numeric(df$DeviceTime) / (5 * 60)) * (5 * 60), origin='1970-01-01')
meansFloor <- aggregate(Concentration ~ DeviceTimeFloor, df, mean)
meansFloor
      DeviceTimeFloor Concentration
1 2013-06-20 11:10:00             1
2 2013-06-20 11:15:00             2
3 2013-06-20 11:20:00             3
4 2013-06-20 11:25:00             4

私は5分間隔の開始時間を報告することを好む - floor()はこれには良いです。 集計を1時間ごとに報告する場合は、2013-06-20 11:00:00のタイムスタンプには、11:00〜11:59:59ではなく10:00:00のデータが含まれていると考えられます - 10:59:59

間隔の終了時間を報告する場合は、 floor()代わりにceiling()を使用できます。 しかし、タイムスタンプ11:01 - 11:05は、 ceiling()によって11:05に変換される(したがってグループ化される)ことに注意してください。 対照的に、 floor() 11:00〜11:04を11:00に変換します。

したがって、彼らはそれぞれ異なる観察セットをグループ化します。 xtsパッケージはfloor()と同じ一連の観測をグループ化しますが、その期間の最後の観測の最後のタイムスタンプを報告します。