R:在事件之间聚合数据

R:在事件之间聚合数据,r,aggregate,R,Aggregate,我的贸易数据如下: TradeNumber OpenTime CloseTime Profit TradeHour Equity 1 01/01/2014 13:10 01/01/2014 14:40 10 13 520 2 01/01/2014 13:25 01/01/2014 13:28 20 13 520 3 01/01/2

我的贸易数据如下:

TradeNumber OpenTime               CloseTime       Profit     TradeHour Equity  
    1       01/01/2014 13:10    01/01/2014 14:40    10        13  520
    2       01/01/2014 13:25    01/01/2014 13:28    20        13  520
    3       01/01/2014 13:29    01/01/2014 15:40    -50       13  520
    4       01/01/2014 13:30    01/01/2014 14:05    -5        13  520
    5       01/01/2014 14:12    01/01/2014 14:40    12        14  560
    6       01/01/2014 14:21    01/01/2014 14:45    -16       14  560
    7       01/01/2014 14:50    01/01/2014 14:59    -14       14  560
    8       01/01/2014 14:58    01/01/2014 15:05    56        14  560
我希望找到每一笔交易在同一时间内,但在该笔交易之前,所有其他交易的利润之和,并在交易时将其计入权益。因此,在给定的示例中,结果将是:

TradeNumber OpenTime              CloseTime       Profit    TradeHour   Equity
1           01/01/2014 13:10    01/01/2014 14:40    10         13   520
2           01/01/2014 13:25    01/01/2014 13:28    20         13   520
3           01/01/2014 13:29    01/01/2014 15:40    -50        13 520 + 20
4           01/01/2014 13:30    01/01/2014 14:05    -5         13   520 + 20
5           01/01/2014 14:12    01/01/2014 14:40    12         14   560
6           01/01/2014 14:21    01/01/2014 14:45    -16        14   560 - 5
7           01/01/2014 14:50    01/01/2014 14:59    -14        14   560+10-5+12-16
8           01/01/2014 14:58    01/01/2014 15:05    56         14   560+10-5+12-16
例如,第8号交易于2014年1月1日14:58开盘。在开盘前,有4个其他交易在该小时内收盘(交易1、4、5和6)。因此,我想在一小时开始时将这4笔交易的利润加到权益中,并将该数字放入交易数据的权益栏中

       for (i in 1:nrow(tradeData))
        {
          tradeData$EquityUSD1 [i] = tradeData$Equity [i] + sum(tradeData$Profit[tradeData$CloseTime <= tradeData$OpenTime[i] & tradeData$CloseTime >= tradeData$tradeHour[i,1]])
  }
for(i in 1:nrow(贸易数据))
{
tradeData$EquityUSD1[i]=tradeData$Equity[i]+总和(tradeData$Profit[tradeData$CloseTime=tradeData$tradeHour[i,1]])
}
这是可行的,但相当缓慢,我想加快速度,因为有成千上万的交易

有什么想法吗?如果我遗漏了任何重要数据/信息,请告知我


谢谢,我还没有用更大的数据集测试速度

dt
##   TradeNumber         OpenTime        CloseTime Profit TradeHour Equity
## 1           1 01/01/2014 13:10 01/01/2014 14:40     10        13    520
## 2           2 01/01/2014 13:25 01/01/2014 13:28     20        13    520
## 3           3 01/01/2014 13:29 01/01/2014 15:40    -50        13    520
## 4           4 01/01/2014 13:30 01/01/2014 14:05     -5        13    520
## 5           5 01/01/2014 14:12 01/01/2014 14:40     12        14    560
## 6           6 01/01/2014 14:21 01/01/2014 14:45    -16        14    560
## 7           7 01/01/2014 14:50 01/01/2014 14:59    -14        14    560
## 8           8 01/01/2014 14:58 01/01/2014 15:05     56        14    560

require(data.table)
setDT(dt)

dt[,OpenTime:=as.POSIXct(OpenTime,format="%m/%d/%Y %H:%M")]
dt[,CloseTime:=as.POSIXct(CloseTime,format="%m/%d/%Y %H:%M")]

dt[,Equity.new:=Equity+sum(dt$Profit[hour(OpenTime)==hour(dt$CloseTime) & OpenTime > dt$CloseTime]), by="TradeNumber"]

dt
##    TradeNumber            OpenTime           CloseTime Profit TradeHour Equity Equity.new
## 1:           1 2014-01-01 13:10:00 2014-01-01 14:40:00     10        13    520        520
## 2:           2 2014-01-01 13:25:00 2014-01-01 13:28:00     20        13    520        520
## 3:           3 2014-01-01 13:29:00 2014-01-01 15:40:00    -50        13    520        540
## 4:           4 2014-01-01 13:30:00 2014-01-01 14:05:00     -5        13    520        540
## 5:           5 2014-01-01 14:12:00 2014-01-01 14:40:00     12        14    560        555
## 6:           6 2014-01-01 14:21:00 2014-01-01 14:45:00    -16        14    560        555
## 7:           7 2014-01-01 14:50:00 2014-01-01 14:59:00    -14        14    560        561
## 8:           8 2014-01-01 14:58:00 2014-01-01 15:05:00     56        14    560        561

假设您的数据位于名为
tradedata
的数据框中,下面的代码似乎生成了您想要的输出:

ddply( tradedata , .(TradeHour) , 
       mutate, 
       Equity=Equity+ cumsum(Profit) - Profit ) 
如果要包括特定交易的利润,请删除
-利润

您可以通过给
ddply
一个
.parallel=TRUE
选项来并行运行它。带有
数据的答案。但是,表格
可能更快。看看哪一个效果最好会很有趣。

dplyr
窗口函数可能会帮助您,谢谢您的回答!我使用了上面的数据表解决方案,因为它似乎快了一点。再次感谢!是的,学习数据表绝对是最好的选择。不过,对于只需要实现一次的人来说,这是一个快速解决方案!