簡體   English   中英

一種更有效的方法來計算每日平均時間序列,其中包括原始序列(在R中)找不到的日期?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM