Как разделить фрейм данных на список, сохранив предыдущий фрейм данных в R?

#r #list #dataframe #split

Вопрос:

У меня есть этот фрейм данных

Это минимальный воспроизводимый пример моего фрейма данных

 value lt;- c(rnorm(39, 5, 2)) Date lt;- seq(as.POSIXct('2021-01-18'), as.POSIXct('2021-10-15'), by = "7 days")  df lt;- data.frame(Date, value)  # This is the vector I have to compare with the Date of the dataframe dates_tour lt;- as.POSIXct(c('2021-01-18', '2021-05-18', '2021-08-18', '2021-10-15'))  df lt;- df %gt;%  mutate(  tour = cut(Date, breaks = dates_tour, labels = seq_along(dates_tour[-1]))  )   

Теперь, когда у меня есть метка фрейма данных для каждой группы на основе dates_tour , я хочу разделить фрейм данных на основе tour фактора, но мне нужно, чтобы каждый список содержал фрейм данных предыдущего фрейма данных. Например df_list[[1]] , содержит строки со tour == 1 вторым списком, которые должны содержать первый и второй фреймы данных tour == 1 | tour == 2 . Третий список должен содержать первый, второй и третий фреймы данных и так далее. Мне нужно поработать над написанием общего кода, который работает с разной длиной dates_tour , так как иногда он может содержать значения разной длины.

Этот код создает список на основе tour значения

 df_list = split(df, df$tour)  

Но не полезно создавать то, что мне нужно

Ответ №1:

Вы также могли бы сделать:

 Reduce(rbind, split(df, ~tour), accumulate = TRUE)  

если у вас есть более старая версия R:

 Reduce(rbind, split(df, df$tour), accumulate = TRUE)  

Вы также можете использовать accumulate из purrr :

 library(purrr) accumulate(split(df, ~tour), rbind)  

Ответ №2:

Для этого мы можем использовать цикл

 df_list lt;- lapply(unique(df$tour), function(x) subset(df, tour %in% seq_len(x)))