Вычисление среднего значения за час между 12 и 1 часами ночи с фреймом данных за минуту: dplyr - PullRequest
0 голосов
/ 15 января 2019

У меня есть поминутная серия в течение ряда лет.

Мне нужно вычислить следующее значение для каждой минуты данных:

q <- (Fn-Fd) / Fn </p>

, где Fn - это среднее значение F в ночное время между 12-1 и AM, а Fd - минутная точка данных.

Теперь очевидно, что Fn меняется каждый день, поэтому одним из подходов будет вычисление Fn, возможно, с использованием функции dplyr, и мне потребуется создать какой-то цикл или реорганизовать мой фрейм данных ...

фиктивные данные:

#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)

Или менее элегантный способ получить Fn сам по себе, в промежутке между первым использованием dplyr - я думаю, что это будет что-то вроде этого:

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))

Но я не уверен, что мой синтаксис там правильный? Я вычисляю среднее F между 12 и 1 AM в день?

Тогда я мог бы просто напечатать среднее значение Fn для каждой минуты в день в моем фрейме данных и сделать простой расчет, чтобы получить Q.

Заранее спасибо за совет здесь.

1 Ответ

0 голосов
/ 15 января 2019

Может как то так?

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 каждую дату мы получаем значение mean для 0-го часа (значения от 00:00 до 00:59) каждый день и вычисляем value, используя приведенную формулу.

...