【问题标题】:Extracting Seasons in list of Dataframes在数据框列表中提取季节
【发布时间】:2020-03-02 00:04:15
【问题描述】:

我有一个数据框列表,例如

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
......

【问题讨论】:

  • 你的尝试在哪里失败了?
  • 我不知道如何循环执行此操作。我通常使用 datelist = dflist$df1$Date 然后 datelist [which(month(datelist ) %in% c(12,1,2))] 然后 ddf1_Station1423 = dflist$df1[dflist$df1$Date %in% date_LfU_DJF ,]
  • 准确提取季节是什么意思?
  • 我想用季节做 4 个子集...所以提取属于一个季节的日期...例如冬季将是 12 月、1 月、2 月...

标签: r list dataframe extract lubridate


【解决方案1】:

构建一个将季节编码为一个月的数据框。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多