#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`
Надеюсь, это поможет!