在R条件下以日期汇总

时间:2012-11-21 16:32:11

标签: r time

我有一些数据,我使用以下代码基于数据集在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

1 个答案:

答案 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