[英]More efficient way to calculate a daily means time series which includes dates not found in the original series (in R)?
我想知道是否有一个函数/程序包(程序包: zoo
吗?)可以让我为第二个系列的值计算每天(或其他)时间序列的平均值。 关于SO的问题有几个,涉及日常工作的创建,但没有一个问题允许按独立系列进行分组。
到目前为止,我已经通过首先通过aggregate
函数计算的方式,然后match
完整的值序列进行match
,以2个多步骤进行了此操作。 以下示例是我的典型情况,其中有些日子不包含任何值:
set.seed(1)
n <- 500
x <- cumsum(runif(n, min=99360*0.1, max=99360*2))
datetime <- as.POSIXlt(x, origin="2000-01-01", tz="GMT")
y <- cumsum(runif(n, min=-1, max=1))
df <- data.frame(datetime, y)
df <- df[-sample(n, n*0.2),] #remove 20%
plot(y ~ datetime, df, t="l")
#calculate daily means
df$date <- as.Date(df$datetime)
daymean <- aggregate(y ~ date, data=df, mean)
#create daily means ts including all possible dates
date.ran <- range(df$date)
df2 <- data.frame(date=seq(date.ran[1], date.ran[2], by="days"), y=NaN)
MATCH <- match(daymean$date, df2$date)
df2$y[MATCH] <- daymean$y
plot(y ~ datetime, df, cex=0.5, pch=20)
lines(as.POSIXlt(df2$date), df2$y, t="o", col=rgb(1,0,0,0.5))
legend("topright", legend=c("Orig.", "daily mean"), col=c(1,rgb(1,0,0,0.5)), lty=c(NA, 1), pch=c(20, 1))
set.seed(1)
n <- 500
x <- cumsum(runif(n, min=99360*0.1, max=99360*2))
datetime <- as.POSIXlt(x, origin="2000-01-01", tz="GMT")
y <- cumsum(runif(n, min=-1, max=1))
#df <- data.frame(datetime, y)
#df <- df[-sample(n, n*0.2),] #remove 20%
#You should set the values to NA instead of removing them
df <- data.frame(datetime, y)
df[sample(n, n*0.2), "y"] <- NA#remove 20%
library(xts)
myxts <- as.xts(df$y,order.by=df$datetime)
ep <- endpoints(myxts,'days')
daymeans <- period.apply(myxts, INDEX=ep, FUN=mean, na.rm=TRUE)
plot(myxts,cex=0.5, pch=20, type="p")
lines(daymeans)
points(daymeans, col="red")
但是,这将计算POSIXct时间,您可能需要将其转换为日期或四舍五入为绘图。
1)动物园以下是动物园的处理方法。 最终结果z2
是一系列均值,每天一次。 我们将df
1列和第2列读入动物园对象z并创建一个网格g
,它是一个零宽度的日期动物园对象。 然后计算均值m
,并将均值与网格合并。
library(zoo)
z <- read.zoo(df[1:2], FUN = identity)
m <- aggregate(z, as.Date, mean)
g <- zoo(, seq(start(m), end(m), by = "day"))
z2 <- merge(m, g, fill = NaN)
coredata(z2)
是数据,而time(z2)
是日期。
2)zoo&magrittr使用zoo和magrittr包来表达这一点的另一种方式是使用以下管道:
library(zoo)
library(magrittr)
df[1:2] %>%
read.zoo(FUN = identity) %>%
aggregate(as.Date, mean) %>%
function(x) merge(x, zoo(, seq(start(x), end(x), by = "day")), fill = NaN)
修订。 新的理解是我们希望创建一个类似df2
的对象。 添加了magrittr方法。 一些小的改进。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.