Конвертировать недельный фрейм данных в месячный фрейм данных в R - PullRequest
0 голосов
/ 03 сентября 2018

Мои данные выглядят так, как показано ниже, с другим node_desc с еженедельными данными за 4 года

         ID1     ID2   DATE_     value
1:     00001     436 2014-06-29 175.8164
2:     00001     436 2014-07-06 188.9264
3:     00001     436 2014-07-13 167.5376
4:     00001     436 2014-07-20 160.7907
5:     00001     436 2014-07-27 185.3018
6:     00001     436 2014-08-03 179.5748

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

df %>%
  tq_transmute(select     = c(value,ID1),
               mutate_fun = apply.monthly,
               FUN        = mean)

Но мой вывод выглядит ниже

DATE_                 value
  <dttm>                <dbl>
1 2014-06-29 00:00:00    144.
2 2014-07-27 00:00:00    143.
3 2014-08-31 00:00:00    143.
4 2014-09-28 00:00:00    152.
5 2014-10-26 00:00:00    156.
6 2014-11-30 00:00:00    166.

Но я бы хотел иметь ID1, ID2, дату (ежемесячно) и значение (либо получить среднее или максимальное значение за 4 недели) вместо того, чтобы просто иметь дату и значение, потому что у меня есть данные разных ID1 за 4 года. кто-нибудь, помогите мне в R

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Проблема в том, что в вашем наборе данных нет ежедневных данных. Функция apply.monthly взята из xts, но tidyquant использует обертки для множества функций, поэтому они работают более аккуратно. apply.monthly нужен объект xts, который представляет собой матрицу с указателем времени.

Также знайте, что apply.monthly возвращает последний доступный день месяца в ваших временных рядах. Глядя на ваш пример, последний день, когда он вернется в июле 2017 года, будет 27-го. Теперь, если у вас есть 5 записей (недель) в месяц, средняя функция сделает это за 5 записей. Это никогда не будет ровно 1 месяц, так как еженедельные данные никогда не охватывают месячные данные.

Но с помощью tidyquant вы можете получить своего рода ежемесячный результат с ID1 и ID2 с вашими данными, если вы объедините результат с исходными данными. Смотрите код ниже. Я не удалил ненужные столбцы.

df1 %>%
  tq_transmute(select     = c(value, ID1),
               mutate_fun = apply.monthly,
               FUN        = mean) %>% 
  mutate(DATE_ = as.Date(DATE_)) %>% 
  inner_join(df1, by = "DATE_")

# A tibble: 3 x 5
  DATE_      value.x ID1   ID2   value.y
  <date>       <dbl> <fct> <fct>   <dbl>
1 2014-06-29    176. 00001 436      176.
2 2014-07-27    176. 00001 436      185.
3 2014-08-03    180. 00001 436      180.

данные:

df1 <- data.frame(ID1 = rep("00001", 6),
           ID2 = rep("436", 6),
           DATE_ = as.Date(c("2014-06-29", "2014-07-06", "2014-07-13", "2014-07-20", "2014-07-27", "2014-08-03")),
           value = c(175.8164,188.9264,167.5376,160.7907,185.3018,179.5748)
           )
0 голосов
/ 03 сентября 2018

Вот мой дубль

dta <- data.frame(id1=rep("00001",6),id2=rep("436",6),
              date_=as.Date(c("29jun2014","6jul2014","13jul2014","20jul2014","27jul2014","3aug2014"),"%d%B%Y"),
              value=c(175.8164,188.9264,167.5376,160.7907,185.3018,179.5748))

И dplyr сделает все остальное. Здесь я суммирую данные, взяв среднее значение

library(dplyr)
my_dta <- dta %>% mutate(month_=format(as.yearmon(date_),"%b"))
my_dta %>% group_by(.dots=c("id1","id2")) %>% summarise(mvalue=mean(value))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...