Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按时间分段的快速替代方法_R_Loops_Optimization - Fatal编程技术网

R 按时间分段的快速替代方法

R 按时间分段的快速替代方法,r,loops,optimization,R,Loops,Optimization,我有一个数据框,其中包含几个月的安全性详细数据。 数据示例: TICKER PER DATE TIME OPEN HIGH LOW CLOSE VOL OPENINT 1 RIM4 1 20/03/13 10:55 140000 140000 140000 140000 2 0 2 RIM4 1 20/03/13 12:19 140000 140000 140000 140000 32 0 3 RIM4 1 20

我有一个数据框,其中包含几个月的安全性详细数据。 数据示例:

  TICKER PER     DATE  TIME   OPEN   HIGH    LOW  CLOSE VOL OPENINT
1   RIM4   1 20/03/13 10:55 140000 140000 140000 140000   2       0
2   RIM4   1 20/03/13 12:19 140000 140000 140000 140000  32       0
3   RIM4   1 20/03/13 14:30 140000 140000 140000 140000   1       0
              DT            dateTime       date
1 20/03/13 10:55 2013-03-20 10:55:00 2013-03-20
2 20/03/13 12:19 2013-03-20 12:19:00 2013-03-20
3 20/03/13 14:30 2013-03-20 14:30:00 2013-03-20
我想计算每天的平均值和标准偏差。所以我开发了这个脚本:

#progress bar
pbb <- winProgressBar(title="Example progress bar", label="0% done", min=0, max=100, initial=0)

#subsetting
mean <- rep(NA,rim4$date[length(rim4$date)]-rim4$date[1])
std.dev <- rep(NA,rim4$date[length(rim4$date)]-rim4$date[1])
daily <- data.frame(mean,std.dev)
names(daily) <- c("mean","std.dev")
daily$date <- NA
daily$date <- rim4$date[1]
for (i in 2:length(daily$date)) {daily$date[i] <- daily$date[i-1]+86400}


for (i in 1:length(daily$date)) { 
  subRim4 <- rim4[format(rim4$date, "%Y-%m-%d") == daily$date[i],5]
  daily$mean[i] <- mean(subRim4, na.rm = TRUE)
  daily$std.dev[i] <- sd(subRim4, na.rm = TRUE)
  setWinProgressBar(pbb, i/(length(daily$date))*100)
}
close(pbb)
#进度条

pbb
数据。对于这种类型的操作,表
非常快。尝试(未测试,因为您的数据对于该问题不是真正可复制的):

或者,您可以使用
dplyr

library(dplyr)
rim4 %.% group_by(DATE) %.% summarise(mean(OPEN), sd(OPEN))
希望这会足够快,你不需要进度条。另外(出于对Joshua发布xts的好奇),一些基准测试:

library(microbenchmark)
microbenchmark(
  rim4.dt[, list(mean(OPEN), sd(OPEN)), by=DATE],
  rim4 %.% group_by(DATE) %.% summarise(mean(OPEN), sd(OPEN)),
  apply.daily(x, function(d) c(mean=mean(d), sd=sd(d))),
  times=5
)
# Unit: milliseconds
#                                                         expr       min        lq    median
#             rim4.dt[, list(mean(OPEN), sd(OPEN)), by = DATE]  45.15606  48.94687  53.58172
#  rim4 %.% group_by(DATE) %.% summarise(mean(OPEN), sd(OPEN))  50.42578  50.60166  50.78464
#    apply.daily(x, function(d) c(mean = mean(d), sd = sd(d))) 589.46499 592.49094 596.35476
我不确定这是否具有代表性。以下是数据:

library(xts)
library(data.table)
library(dplyr)
set.seed(21)
size <- 1e6
val <- rnorm(size)
times <- seq(as.POSIXct("2014-03-28"), by="-1 min", length.out=size)
x <- xts(val, times)
rim4 <- data.frame(DATETIME=times, OPEN=val)
rim4$DATE <- format(rim4$DATETIME, "%Y-%m-%d")
rim4.dt <- data.table(rim4)
库(xts)
库(数据表)
图书馆(dplyr)
种子(21)

大小使用一个实际的时间序列类(如xts),许多事情可以做得容易得多:

library(xts)
set.seed(21)
x <- xts(rnorm(1e6), seq(Sys.time(), by="-1 min", length.out=1e6))
y <- apply.daily(x, function(d) c(mean=mean(d), sd=sd(d)))
库(xts)
种子(21)

如果您发布了一个dput(head(object))输出,那么以测试和演示的形式获取该数据就不是一个PITA了
format.POSIXct
允许您构造一个向量,该向量可用于
ave
tapply
聚合
mean
s和
sd
s。我试图使用您的解决方案@JoshuaUlrich,但当我将数据帧子集以创建X时,运行y时出现错误:“xts(X)中的错误”:order.by需要适当的基于时间的对象”。我使用了POSIXct日期格式。@BiXiC:那么传递给
xts()
order.by
参数不是
POSIXct
。如果您提供了一个最小的、可复制的示例,那么就更容易提供帮助。
library(xts)
set.seed(21)
x <- xts(rnorm(1e6), seq(Sys.time(), by="-1 min", length.out=1e6))
y <- apply.daily(x, function(d) c(mean=mean(d), sd=sd(d)))