使用每分钟数据帧计算 12 点到凌晨 1 点之间的小时平均值:dplyr
Calculating an hour average between 12 and 1AM with per min dataframe: dplyr
我有多年的每分钟时间序列。
我需要为每个分钟数据点计算以下值:
q <- (Fn-Fd)/Fn
其中Fn为夜间12点到1点的平均F值,Fd为分钟数据点。
现在显然 Fn 每天都在变化,所以一种方法可能是使用 dplyr 函数计算 Fn,我需要创建某种循环或重新组织我的数据框...
虚拟数据:
#string of dates for a one month
datetime <- seq(
from=as.POSIXct("2012-1-1 0:00:00", tz="UTC"),
to=as.POSIXct("2012-2-1 0:00:00", tz="UTC"),
by="min"
)
#variable F
F <- runif(44641, min = 0, max =2)
#dataframe
df <- as.data.frame(cbind(datetime,F))
library(lubridate)
#make sure its in "POSIXct" "POSIXt" format
df$datetime <- as_datetime(df$datetime)
或者一种不太优雅的方法可能是在第一次使用 dplyr 的时间间隔内自行获取 Fn - 我认为它会是这样的:
Fn <- df %>%
filter(between(as.numeric(format(datetime, "%H")), 0, 1)) %>%
group_by(hour=format(datetime, "%Y-%m-%d %H:")) %>%
summarise(value=mean(df$F))
但我不确定我的语法是否正确?我是在计算每天凌晨 12 点到凌晨 1 点之间的平均 F 吗?
然后我可以将每天每一分钟的平均 Fn 值打印到我的数据框并进行简单计算以获得 Q。
在此先感谢您的建议。
也许是这样的?
library(dplyr)
library(lubridate)
df %>%
group_by(Date = as.Date(datetime)) %>%
mutate(F_mean = mean(F[hour(datetime) == 0]),
value = (F_mean - F)/F_mean) %>%
ungroup() %>%
select(-F_mean, -Date)
# datetime F value
# <dttm> <dbl> <dbl>
# 1 2012-01-01 00:00:00 1.97 -0.902
# 2 2012-01-01 00:01:00 0.194 0.813
# 3 2012-01-01 00:02:00 1.52 -0.467
# 4 2012-01-01 00:03:00 1.66 -0.599
# 5 2012-01-01 00:04:00 0.765 0.262
# 6 2012-01-01 00:05:00 1.31 -0.267
# 7 2012-01-01 00:06:00 1.62 -0.565
# 8 2012-01-01 00:07:00 0.642 0.380
# 9 2012-01-01 00:08:00 1.62 -0.560
#10 2012-01-01 00:09:00 1.68 -0.621
# ... with 44,631 more rows
我们首先 group_by
每个日期获取每天第 0 小时的 mean
值(值在 00:00 到 00:59 之间)并计算 value
使用给出的公式。
我有多年的每分钟时间序列。
我需要为每个分钟数据点计算以下值:
q <- (Fn-Fd)/Fn
其中Fn为夜间12点到1点的平均F值,Fd为分钟数据点。
现在显然 Fn 每天都在变化,所以一种方法可能是使用 dplyr 函数计算 Fn,我需要创建某种循环或重新组织我的数据框...
虚拟数据:
#string of dates for a one month
datetime <- seq(
from=as.POSIXct("2012-1-1 0:00:00", tz="UTC"),
to=as.POSIXct("2012-2-1 0:00:00", tz="UTC"),
by="min"
)
#variable F
F <- runif(44641, min = 0, max =2)
#dataframe
df <- as.data.frame(cbind(datetime,F))
library(lubridate)
#make sure its in "POSIXct" "POSIXt" format
df$datetime <- as_datetime(df$datetime)
或者一种不太优雅的方法可能是在第一次使用 dplyr 的时间间隔内自行获取 Fn - 我认为它会是这样的:
Fn <- df %>%
filter(between(as.numeric(format(datetime, "%H")), 0, 1)) %>%
group_by(hour=format(datetime, "%Y-%m-%d %H:")) %>%
summarise(value=mean(df$F))
但我不确定我的语法是否正确?我是在计算每天凌晨 12 点到凌晨 1 点之间的平均 F 吗?
然后我可以将每天每一分钟的平均 Fn 值打印到我的数据框并进行简单计算以获得 Q。
在此先感谢您的建议。
也许是这样的?
library(dplyr)
library(lubridate)
df %>%
group_by(Date = as.Date(datetime)) %>%
mutate(F_mean = mean(F[hour(datetime) == 0]),
value = (F_mean - F)/F_mean) %>%
ungroup() %>%
select(-F_mean, -Date)
# datetime F value
# <dttm> <dbl> <dbl>
# 1 2012-01-01 00:00:00 1.97 -0.902
# 2 2012-01-01 00:01:00 0.194 0.813
# 3 2012-01-01 00:02:00 1.52 -0.467
# 4 2012-01-01 00:03:00 1.66 -0.599
# 5 2012-01-01 00:04:00 0.765 0.262
# 6 2012-01-01 00:05:00 1.31 -0.267
# 7 2012-01-01 00:06:00 1.62 -0.565
# 8 2012-01-01 00:07:00 0.642 0.380
# 9 2012-01-01 00:08:00 1.62 -0.560
#10 2012-01-01 00:09:00 1.68 -0.621
# ... with 44,631 more rows
我们首先 group_by
每个日期获取每天第 0 小时的 mean
值(值在 00:00 到 00:59 之间)并计算 value
使用给出的公式。