在数据帧列表中提取季节
Extracting Seasons in list of Dataframes
我有一个数据帧列表,例如
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
......
构建一个将季节编码为一个月的数据框。
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)
})
请注意,这向原始数据框添加了两列。我们可以再次使用 map 轻松删除它们。
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))
})
我有一个数据帧列表,例如
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
......
构建一个将季节编码为一个月的数据框。
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)
})
请注意,这向原始数据框添加了两列。我们可以再次使用 map 轻松删除它们。
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))
})