Извлечение сезонов в списке Dataframes - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть список фреймов данных, например,

library(lubridate)
df1 = data.frame (Date = seq(ymd('2005-04-16'),ymd('2016-10-15'),by='day'), 
                  Station1423 = replicate(1,sample(0:130, 4201,rep=TRUE)))
df2 = data.frame (Date = seq(ymd('2001-09-02'),ymd('2018-12-31'),by='day'), 
                  Station4322 = replicate(1,sample(0:130, 6330,rep=TRUE)))
df3 = data.frame (Date = seq(ymd('1995-02-20'),ymd('2018-12-31'),by='day'), 
                  Station1242 = replicate(1,sample(0:130, 8716,rep=TRUE)))

dflist = list(df1, df2, df3)
names(dflist) = c("df1", "df2", "df3")

Теперь я хочу извлечь сезоны для каждого фрейма данных в списке. Результатом должен быть вложенный список, подобный этому:

dflist    list of 3
   df1       list of 4
     DJF: dataframe
     ..$Date
     ..$Station1423   
     JJA: dataframe
     ..$Date
     ..$Station1423   
     MAM: dataframe
     ..$Date
     ..$Station1423 
     SON: dataframe
     ..$Date
     ..$Station1423     
 df2       list of 4
     DJF: dataframe
     ..$Date
     ..$Station4322   
     JJA: dataframe
     ..$Date
     ..$Station4322   
.....and so on

Кроме того, я бы согласился с простым списком, подобным этому:

dflist    list of 12
  df1_DJF: dataframe
      ..$Date
      ..$Station1423 
  df1_JJA: dataframe
......

1 Ответ

2 голосов
/ 05 ноября 2019

Построить фрейм данных с кодированием сезонов до месяца.

seasons <- tibble(month = 1:12, season = c(rep("DJF", 2), rep("MAM", 3), rep("JJA", 3), rep("SON", 3), "DJF"))

Используйте map, чтобы присоединиться к каждому фрейму данных по месяцам, а затем split по сезону.

library(lubridate)
library(purrr)
library(dplyr)

new_list <- dflist %>%
  map( ~ {mutate(., month = month(Date)) %>%
      left_join(seasons, by = "month") %>%
      split(f = .$season)
  })

Обратите внимание, что это добавило два столбца к исходным фреймам данных. Мы можем легко удалить их снова с помощью карты.

new_list %>%
  map_depth(.depth = 2, ~ select(., -month, - season))

Или вложить еще один map в оригинал.

new_list <- dflist %>%
  map( ~ {mutate(., month = month(Date)) %>%
      left_join(seasons, by = "month") %>%
      split(f = .$season) %>%
      map(~ select(., -month, -season))
  })
...