Создайте цикл с датами

#r #loops #date

Вопрос:

Я работаю с таким набором данных, как этот:

       date         time      solar
1  2019-05-17    11:20:00   710
2  2019-05-17    11:25:00   712
3  2019-05-17    11:30:00   787
.
.
.
70 2019-08-06    10:20:00   926
71 2019-08-06    10:25:00   204
72 2019-08-06    10:30:00   498
.
.
.
90 2020-01-17    10:20:00   936
91 2020-01-17    10:25:00   639
92 2020-01-17    10:30:00   876

 

В первом столбце у меня есть дата, начиная с каждого дня с 2019-05-17 по 2021-09-10, и я хочу создать новый набор данных для каждого месяца, например, мне нужен новый набор данных, содержащий все те же данные, но только за январь 2020 года, и повторяйте это каждый месяц… Я работал таким образом:

С library(tibbletime) помощью первого я преобразую свой фрейм данных(df1) в:

 df_t<- as_tbl_time(df1, index = date) 
 

Затем с:

 may19 <- filter_time(df_t, ~'2019-05')
jun19 <- filter_time(df_t, ~'2019-06')
jul19 <- filter_time(df_t, ~'2019-07')
ago19 <- filter_time(df_t, ~'2019-08')
sep19 <- filter_time(df_t, ~'2019-09')
oct19 <- filter_time(df_t, ~'2019-10')
nov19 <- filter_time(df_t, ~'2019-11')
dic19 <- filter_time(df_t, ~'2019-12') 
 

Создает новый набор данных, в котором я фильтрую df_t только с информацией о нужном мне месяце, проблема в том, что я делаю это для каждого месяца с 2019 по 2021 год, и я хотел бы сделать это более простым способом, например, с помощью цикла, проблема в том, что я не знаю, как, потому что, если я сделаю цикл, я не смогу поместить i в: ‘2019-i’, потому что это не работает.

Ответ №1:

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

Сначала я просто загружу два пакета и создам некоторые фиктивные данные:

 library(lubridate)
library(dplyr)

dates <- seq(ymd("2015-12-01"), ymd("2021-12-01"), by = "days")

df <- tibble(date = dates,
             value = rnorm(length(dates)))
 

Затем я создаю столбцы «месяц/год» и использую их для разделения фрейма данных:

 month_list <- df %>%
  mutate(date = as_date(date),
         year = year(date),
         month = month(date)) %>%
  group_by(year, month) %>%
  group_split()
 

В зависимости от того, как настроен ваш столбец даты, он уже as_date() должен работать, а может и не понадобиться.

Это даст вам список тибблов, каждый за определенный месяц. Вы можете получить доступ к ним по отдельности, индексируя, например month_list[[1]]

Возможно, вам захочется назначить комбинацию месяца и года «имени» каждого элемента списка. Это значительно упростит доступ к конкретному месяцу, который вы хотите (аналогично тому, как вы называли свои отдельные ДФ «Декабрь 19», «Январь 20» и т. Д.). Здесь я повторяю список, извлекаю первые значения из столбца месяц и год во фрейме данных и устанавливаю его в качестве имени этого элемента:

 names(month_list) <- lapply(month_list, function(x){

   m <- x$month[1]
   y <- x$year[1]

   name <- paste(m,y, sep = "-")

   return(name)

})
 

Это позволит вам получить доступ к соответствующему кадру данных, указав месяц-год, например:

 month_list["1-2016"]
 

или

 month_list
 #r #loops #date



Вопрос:

Я работаю с таким набором данных, как этот:
       date         time      solar
1  2019-05-17    11:20:00   710
2  2019-05-17    11:25:00   712
3  2019-05-17    11:30:00   787
.
.
.
70 2019-08-06    10:20:00   926
71 2019-08-06    10:25:00   204
72 2019-08-06    10:30:00   498
.
.
.
90 2020-01-17    10:20:00   936
91 2020-01-17    10:25:00   639
92 2020-01-17    10:30:00   876

 

В первом столбце у меня есть дата, начиная с каждого дня с 2019-05-17 по 2021-09-10, и я хочу создать новый набор данных для каждого месяца, например, мне нужен новый набор данных, содержащий все те же данные, но только за январь 2020 года, и повторяйте это каждый месяц... Я работал таким образом:

С library(tibbletime) помощью первого я преобразую свой фрейм данных(df1) в:

 df_t<- as_tbl_time(df1, index = date) 
 

Затем с:

 may19 <- filter_time(df_t, ~'2019-05')
jun19 <- filter_time(df_t, ~'2019-06')
jul19 <- filter_time(df_t, ~'2019-07')
ago19 <- filter_time(df_t, ~'2019-08')
sep19 <- filter_time(df_t, ~'2019-09')
oct19 <- filter_time(df_t, ~'2019-10')
nov19 <- filter_time(df_t, ~'2019-11')
dic19 <- filter_time(df_t, ~'2019-12') 
 

Создает новый набор данных, в котором я фильтрую df_t только с информацией о нужном мне месяце, проблема в том, что я делаю это для каждого месяца с 2019 по 2021 год, и я хотел бы сделать это более простым способом, например, с помощью цикла, проблема в том, что я не знаю, как, потому что, если я сделаю цикл, я не смогу поместить i в: '2019-i', потому что это не работает.

Ответ №1:

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

Сначала я просто загружу два пакета и создам некоторые фиктивные данные:

 library(lubridate)
library(dplyr)

dates <- seq(ymd("2015-12-01"), ymd("2021-12-01"), by = "days")

df <- tibble(date = dates,
             value = rnorm(length(dates)))
 

Затем я создаю столбцы "месяц/год" и использую их для разделения фрейма данных:

 month_list <- df %>%
  mutate(date = as_date(date),
         year = year(date),
         month = month(date)) %>%
  group_by(year, month) %>%
  group_split()
 

В зависимости от того, как настроен ваш столбец даты, он уже as_date() должен работать, а может и не понадобиться.

Это даст вам список тибблов, каждый за определенный месяц. Вы можете получить доступ к ним по отдельности, индексируя, например month_list[[1]]

Возможно, вам захочется назначить комбинацию месяца и года "имени" каждого элемента списка. Это значительно упростит доступ к конкретному месяцу, который вы хотите (аналогично тому, как вы называли свои отдельные ДФ "Декабрь 19", "Январь 20" и т. Д.). Здесь я повторяю список, извлекаю первые значения из столбца месяц и год во фрейме данных и устанавливаю его в качестве имени этого элемента:

 names(month_list) <- lapply(month_list, function(x){

   m <- x$month[1]
   y <- x$year[1]

   name <- paste(m,y, sep = "-")

   return(name)

})
 

Это позволит вам получить доступ к соответствующему кадру данных, указав месяц-год, например:

 month_list["1-2016"]
 

или

1-2016`

Надеюсь, это поможет!