高效(重复)循环

时间:2014-07-14 06:52:00

标签: r

我试图评估给定行(k)中的价格(k)是否等于上面的价格(k-1)。如果是我想要从前面的价格和有问题的价格,体积(k)+交易量(k + 1)求和,然后删除具有重复价格的行,行k。

我有以下重复循环,我将其应用于要删除重复值的大型数据集。

k <- 1
repeat{
if( Prices$Price[ k + 1 ] == Prices$Price[ k ] ){
Prices$CumVolume[ k + 1 ] <- Prices$CumVolume[ k + 1 ] + Prices$CumVolume[ k ] 
Prices <- Prices[ -k , ]
k <- k + 1
if( k > nrow( Prices ) ) break 
}
}

循环非常慢,我想知道是否有办法加快速度。不幸的是,我对R来说相对较新,并且很难找到解决这个问题的最佳方法。

在R中还有一种方法可以观察循环当前的迭代吗?即在每次迭代时将它显示在工作区中?

示例数据:

      Date         Time     Price     CumVolume Ret MeanRet VolRet
26 01-JAN-2009 21:30:01.783 96.660       537    0       0      0
31 01-JAN-2009 21:30:58.041 96.650        78    0       0      0
33 01-JAN-2009 21:34:09.589 96.640        60    0       0      0
35 01-JAN-2009 21:34:10.879 96.640        40    0       0      0
37 01-JAN-2009 21:35:55.001 96.635        50    0       0      0

2 个答案:

答案 0 :(得分:2)

看来你想要这样的东西:

DF <- read.table(text="      Date         Time     Price     CumVolume Ret MeanRet VolRet
26 01-JAN-2009 21:30:01.783 96.660       537    0       0      0
31 01-JAN-2009 21:30:58.041 96.650        78    0       0      0
33 01-JAN-2009 21:34:09.589 96.640        60    0       0      0
35 01-JAN-2009 21:34:10.879 96.640        40    0       0      0
37 01-JAN-2009 21:35:55.001 96.635        50    0       0      0", header=TRUE)

#create a run id
DF$runs <- cumsum(c(TRUE, diff(DF$Price) != 0))
#sum per each price run
DF$CCVolume <- with(DF, ave(CumVolume, runs, FUN=sum))
#remove duplicated prices
DF[!duplicated(DF$Price), ]
#          Date         Time  Price CumVolume Ret MeanRet VolRet runs CCVolume
#26 01-JAN-2009 21:30:01.783 96.660       537   0       0      0    1      537
#31 01-JAN-2009 21:30:58.041 96.650        78   0       0      0    2       78
#33 01-JAN-2009 21:34:09.589 96.640        60   0       0      0    3      100
#37 01-JAN-2009 21:35:55.001 96.635        50   0       0      0    4       50

答案 1 :(得分:1)

我认为你的代码因为你的增量索引而无限循环。K=k+1Break总是在条件之内,我希望你想要这个

k=1
z=unique(Prices$Price)
for(i in 1:length(z))
{
     dupindex=which(z[i]==Prices$Price)
     Prices$CumVolume[tail(dupindex,n=1)]=sum(Prices$CumVolume[dupindex])
     Prices=Prices[-(dupindex[1:length(dupindex)-1]),]

}

我希望它有所帮助,谢谢。