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