我有一些数据,我使用以下代码基于数据集在1天内以独特的分钟方式汇总信息。 但是,我希望能够使用多天组合的数据文件来运行此代码。我在数据集中有一个日期列,因此我可以将其用作每天的唯一标识符。考虑到日期不一样,有没有办法在1分钟内汇总数据?
问题是,唯一函数会提取第一天发生的唯一事件,然后添加之后发生的所有相同事件。如果我也基于日期,我相信我可以在一个长数据集中为每一天创建唯一的1分钟条目。
以下是适用于单日数据的代码。
novo <- read.csv("C:/Users/Morten/Desktop/data.csv", header = TRUE, stringsAsFactors=FALSE )
TimeStamp <- novo[,1]
price <- novo[, 2]
volume <- novo[,3]
nV <- sum(volume)
MinutesFloor <- unique(floor(TimeStamp))
nTradingMinutes <- length(MinutesFloor)
PriceMin <- rep(0, nTradingMinutes)
VolumeMin <- rep(0, nTradingMinutes)
for( j in 1:nTradingMinutes){
ThisMinutes <- (floor(TimeStamp) == MinutesFloor[j])
PriceMin[j] <- mean(price[ThisMinutes])
VolumeMin[j] <- sum(volume[ThisMinutes])
}
提前致谢
数据格式:
日期, “ORD”, “股份”, “finalprice”, “时间”, “股票”
20100301,C,80,389,540.004,1158
20100301,C,77,389,540.004,1158
20100301,C,60,389,540.004,1158
20100301,C,28,389,540.004,1158
20100301,C,7,389,540.004,1158
20100302,C,25,394.7,540.00293333,1158
20100302,C,170,394.7,540.00293333,1158
20100302,C,40,394.7,540.00293333,1158
20100302,C,75,394.7,540.00293333,1158
20100302,C,100,394.7,540.00293333,1158
20100302,C,1,394.7,540.00293333,1158
答案 0 :(得分:3)
我想建议一个从根本上简化的代码版本。
你做的事情相当低效。 R用于计算由不同数据值聚类的摘要统计。 我们将大量使用这些方法。
我认为您的数据属于您提供的格式。在我的系统中,这看起来像
novo <- read.csv("test.csv", header = TRUE, stringsAsFactors=FALSE )
这给了我们:
> str(novo)
'data.frame': 11 obs. of 6 variables:
$ date : int 20100301 20100301 20100301 20100301 20100301 20100302 20100302 20100302 20100302 20100302 ...
$ ord : chr "C" "C" "C" "C" ...
$ shares : int 80 77 60 28 7 25 170 40 75 100 ...
$ finalprice: num 389 389 389 389 389 ...
$ time : num 540 540 540 540 540 ...
$ stock : int 1158 1158 1158 1158 1158 1158 1158 1158 1158 1158 ...
现在,我假设您的日期已订购YearMonthDate。如果您有不同的排序,则必须更改下面的format命令。此外,您的time
可能只需几分钟。
然后我们可以使用POSIXct
数据类型创建包含日期和时间的时间戳:
timestamps <- as.POSIXct(as.character(novo$date), format='%Y%m%d') + novo$time*60
现在,我们通过创建一个因子变量并使用cut
函数来进行四舍五入的分钟:
timestampsByMinute <- droplevels(cut(timestamps, 'min'))
请注意,附加droplevels
功能只会删除没有可用数据项的分钟。
最后,我们可以计算您在for
- 循环中执行的摘要统计:
tapply
是一个函数,它接受第一个参数,将其分成由第二个参数定义的组,并将作为第三个参数的函数应用于该数据。因此,我们可能只会在您的数据上抛出tapply
函数。 (我觉得您在代码中使用的列号与示例数据中的列名不匹配 - 如果我以错误的方式解释您的意思,请随意适应不同的列)
PriceMin <- tapply(novo$finalprice, timestampsByMinute, mean)
VolumeMin <- tapply(novo$shares, timestampsByMinute, sum)
这给了我们
> PriceMin
2010-03-01 09:00:00 2010-03-02 09:00:00
389.0 394.7
> VolumeMin
2010-03-01 09:00:00 2010-03-02 09:00:00
252 411
这可能是你想要的。
请注意,tapply
比您使用的循环快得多。如果您有大量数据文件,这可能很重要。
我希望我的代码中没有任何错误 - 考虑到您每天仅提供一分钟的数据,测试并不容易。
编辑:
根据请求,这里有一个小修改,可以从数据中删除时间信息:
> unname(VolumeMin)
[1] 252 411
> unname(PriceMin)
[1] 389.0 394.7