3

6 つの異なるステーションについて、1 分ごとの降水記録を含むデータセットがあります。すべてのステーションについて、5 分ごとに合計したいと思います。これらは私のデータセットの最初の 5 行です (合計で 17280 行あります)。

  P_alex P_hvh P_merlijn P_pascal P_thurlede P_tosca                date
    0     0         0        0          0       0 2011-06-27 22:00:00
    0     1         5        2          0       0 2011-06-27 22:01:00
    0     0         0        0          0       0 2011-06-27 22:02:00
    0     6         2        3          0       0 2011-06-27 22:03:00
    0     0         0        0          0       0 2011-06-27 22:04:00

インターネットでヘルプを見つけようとしましたが、役立つ答えが見つかりません。

また、次のコードを使用するため、総和も必要でしたが、他の総和を作成する場合、このコードは役に立ちません。

uur_alex = tapply(disdro$P_alex, as.POSIXct(trunc(disdro$date, "hour")), sum)

ここで、さまざまな合計を作成するために使用できるコードが欲しいので、5 分間 (質問のように) だけでなく、30 分間も使用します。誰かが私を助けてくれることを願っています。

4

4 に答える 4

7

cut日時オブジェクトと非常にうまく連携するため、集計したい 5 分間隔を作成するために使用できます。次に例を示します。

まず、いくつかのサンプル データ:

set.seed(1)
mydf <- data.frame(P_alex = sample(0:5, 40, replace = TRUE),
                   P_hvh = sample(0:3, 40, replace = TRUE),
                   date = as.POSIXct("2011-06-27 22:00:00") + 60 * 0:39)
list(head(mydf), tail(mydf))
# [[1]]
#   P_alex P_hvh                date
# 1      1     3 2011-06-27 22:00:00
# 2      2     2 2011-06-27 22:01:00
# 3      3     3 2011-06-27 22:02:00
# 4      5     2 2011-06-27 22:03:00
# 5      1     2 2011-06-27 22:04:00
# 6      5     3 2011-06-27 22:05:00
# 
# [[2]]
#    P_alex P_hvh                date
# 35      4     1 2011-06-27 22:34:00
# 36      4     3 2011-06-27 22:35:00
# 37      4     3 2011-06-27 22:36:00
# 38      0     1 2011-06-27 22:37:00
# 39      4     3 2011-06-27 22:38:00
# 40      2     3 2011-06-27 22:39:00

次に、集計を実行します。次の例では、元のデータセットからすべての列を集計しますが、データセットから "date" 変数を削除します ( を使用mydf[setdiff(names(mydf), "date")])。

# Aggregate all columns by the intervals created with cut.
# For the dataset, we drop the original date column since
#   it is no longer needed here. Our function is "sum"
aggregate(. ~ cut(mydf$date, "5 min"), 
          mydf[setdiff(names(mydf), "date")], 
          sum)
#   cut(mydf$date, "5 min") P_alex P_hvh
# 1     2011-06-27 22:00:00     12    12
# 2     2011-06-27 22:05:00     16     8
# 3     2011-06-27 22:10:00     12     5
# 4     2011-06-27 22:15:00     17     6
# 5     2011-06-27 22:20:00     10     8
# 6     2011-06-27 22:25:00     11     8
# 7     2011-06-27 22:30:00     12     7
# 8     2011-06-27 22:35:00     14    13
于 2013-01-09T16:33:02.907 に答える
4

これを実現するためにパッケージからrollapply使用できます。zoo例えば、

require(zoo)
tester <- data.frame(x=1:100,y=1:100)    
output <- rollapply(tester,5,(sum),by=5,by.column=TRUE,align='right')
于 2013-01-09T14:03:20.953 に答える
3

1 つの方法は、整数除算 ( ) を使用して、日付を 5 分単位のブロックにマップすることです%/%。日時を使用する場合、基本はUNIX エポックになります。POSIXctを使用してこれらのブロックを合計できますaggregate

x <- data.frame(date=Sys.time()+60*0:10,value1=0:10,value2=rnorm(11))

aggregate(.~as.numeric(date)%/%(5*60),data=x,FUN=sum)
  as.numeric(date)%/%(5 * 60)       date value1     value2
1                     4525797 1357739399      0  0.6209565
2                     4525798 6788697893     15 -1.4342917
3                     4525799 6788699393     40  0.8064627
于 2013-01-09T13:55:11.673 に答える
1

SQL に精通している場合は、データを 5 分間隔でグループ化する SQL ステートメントを簡単に作成できます。たとえば、postgresql では次のようなものを使用できます。

select Now(), date_trunc('hour',Now()) + interval '1 minute' * trunc(date_part('minute',Now())/5)*5

私は sqldf パッケージを使用して、そのようなすべての変換を行います。

于 2013-01-09T13:58:05.090 に答える