2016-06-16 10 views
1

データフレームは変数DateTypeTotalTypeであるいずれかBuy又はSellから成ります。合計グループ(類似の値によってグループ)

どのように同じTypeの隣接する観測値だけがグループ化されるように観測値をグループ化し、次に各グループのすべての観測値の合計をTotalと合計することができます。つまり、Typeの値が変更されるまで、次の観測値を現在のグループに追加し続けます。

  • OBS 1 & 2
  • OBS 3 & 4
  • OBS 5 & 6
  • OBS 78 &は、例えば以下のように、以下のデータフレームに、基であります9

enter image description here

再生可能なデータは、あなたが@bgoldst感謝:

df1 <- data.frame(Date=rep(as.POSIXct('2016-06-16 06:27:39'),9L), 
        Type=c('Buy','Buy','Sell','Sell','Buy','Buy','Sell','Sell','Sell'), 
        Total=c(1.548012e+01,1.051480e+02,5.956740e+00,3.872415e+01,1.333391e+02,1.941060e-01,1.941060e-01,1.941060e-01,3.277059e-01)) 
+2

避けるようにしてみてくださいデータの写真。再現可能な例がはるかに役立ちます。 – Sotos

答えて

2

はここaggregate()を中心に構築された、わずか醜いベースR・ソリューションです。 Typecumsum()の連続する要素間の不等式の比較を使用して、非順次インスタンスTypeを区別するための一時的なグループ化列を合成します。 data.tableで実装

df <- data.frame(Date=rep(as.POSIXct('2016-06-16 06:27:39'),9L),Type=c('Buy','Buy','Sell','Sell','Buy','Buy','Sell','Sell','Sell'),Total=c(1.548012e+01,1.051480e+02,5.956740e+00,3.872415e+01,1.333391e+02,1.941060e-01,1.941060e-01,1.941060e-01,3.277059e-01)); 
aggregate(Total~Date+Type+TypeSeq,transform(df,TypeSeq=c(0L,cumsum(Type[-1L]!=Type[-nrow(df)]))),sum)[-3L]; 
##     Date Type  Total 
## 1 2016-06-16 06:27:39 Buy 120.6281200 
## 2 2016-06-16 06:27:39 Sell 44.6808900 
## 3 2016-06-16 06:27:39 Buy 133.5332060 
## 4 2016-06-16 06:27:39 Sell 0.7159179 

同じ考え:data.tableを使用して

library(data.table); 
dt <- as.data.table(df); 
dt[,.(Total=sum(Total)),.(Date,Type,TypeSeq=c(0L,cumsum(Type[-1L]!=Type[-nrow(dt)])))][,-3L,with=F]; 
##     Date Type  Total 
## 1: 2016-06-16 06:27:39 Buy 120.6281200 
## 2: 2016-06-16 06:27:39 Sell 44.6808900 
## 3: 2016-06-16 06:27:39 Buy 133.5332060 
## 4: 2016-06-16 06:27:39 Sell 0.7159179 
+0

私は昨日同じような投稿をしていました(グループ分けに関して)(http://stackoverflow.com/questions/37809094/create-group-names-for-consecutive-values)、集約部分はすでに何回も回答されています。 – zx8754

0

シンプルなソリューション(CRAN上の最新の安定、v1.9.6):

require(data.table) 
# Create group id *and* aggregate in one-go using expressions in 'by' 
setDT(df)[, .(total = sum(Total)), by=.(group=rleid(Type), Date)] 

# group    Date  total 
# 1:  1 2016-06-16 06:27:39 120.6281200 
# 2:  2 2016-06-16 06:27:39 44.6808900 
# 3:  3 2016-06-16 06:27:39 133.5332060 
# 4:  4 2016-06-16 06:27:39 0.7159179 
関連する問題