我有一些每1分钟收集一次的数据集,但我必须用10分钟的数据替换数据。所以我有这个R代码。
for(k in 1:(length(temp[,1])/10)){
temp2[k,1]<-temp[1,1]
temp2[k,2]<-temp[k*10,2]
temp2[k,3]<-mean(na.omit(as.numeric(temp[((k-1)*10+1):k*10,3])))
}
但是,此代码的效率太低。 还有一个问题。由于某些数据丢失,时间变量并不总是连续的。我必须计算每10分钟的数据(例如2014-01-01 00:00到2014-01-01 00:10),无论这10分钟内有多少障碍物。所以循环进入
tmp<-na.omit(temp[temp[,2]>(st+600*(k-1)) & temp[,2]<=(st+600*k),])
temp2[k,1]<-tmp[1,1]
temp2[k,2]<-st+600*k
temp2[k,3]<-mean(na.omit(as.numeric(tmp[,3])))
这是不可忍受的。并且它无法有效处理像#34;有些月份缺失的情况&#34;。 那么,我怎样才能在R中解决这个问题,而效率并不低。
原始数据:
Time Var1
2014-01-01 00:01 10
2014-01-01 00:02 12
2014-01-01 00:03 43
...
2014-01-01 00:10 52
期望的输出:
Time Var1
2014-01-01 00:10 (mean of every 10 mins)
2014-01-01 00:20 (mean of every 10 mins)
...
答案 0 :(得分:4)
查看xts
包,特别是period.apply
函数endpoints
假设您可以将数据作为xts对象(在本例中称为xt.data
),那么以下内容将起作用。
# example data
times <- seq(Sys.time()-50000,Sys.time(),by=60)
mydt <- data.frame(time = times[sample(seq_along(times),size=300)], test = runif(300))
xt.data <- as.xts(mydt[,2], order.by= mydt[['time']])
period.apply(xt.data, endpoints(xt.data,'minutes',10),mean)
答案 1 :(得分:2)
查看?cut.POSIXt
,?seq.POSIXt
和round.POSIXt
。 cut
和seq
函数允许以"10 min"
间隔设置中断,但遗憾的是圆函数似乎没有那么好的功能。您可以乘以10,舍入到最接近的“min”并除以10,但我还没有尝试过这一切。
答案 2 :(得分:1)
如果你记住,POSIXlt格式的时间使操作每个组件变得微不足道,那么它相对容易。我在这里做的是使用POSIXct格式读取数据(因为你无法用POSIXlt读入),转换为POSIXlt,然后只需10分钟的分组,转换回来,然后进行聚合。这应该运行得非常快。
dat <- read.table(text = 'time, y
2014-01-01 00:01, 10
2014-01-01 00:02, 12
2014-01-01 00:22, 43',
header = TRUE, sep = ',', colClasses = c('POSIXct', 'numeric'))
dat$time <- as.POSIXlt(dat$time)
dat$time[[2]] <- floor(dat$time[[2]] / 10) * 10
dat$time <- as.POSIXct(dat$time)
aggregate(y ~ time, data = dat, mean)
顺便说一句,你说每10分钟替换一次,而不是聚合。在这种情况下,聚合线将变为:
y$time <- ave(y, time)
而且,如果您想保持原始时间和所有其他数据完好无损,但只需通过10分钟替换,您可以在read.table
之后替换所有内容:
dat$time <- as.POSIXlt(dat$time)
g <- floor(dat$time[[2]] / 10) * 10
dat$y <- ave(y, g)