如何为年月序列创建和保存子集数据框

How to create and save subset dataframes for sequence of year-month

我想从给定年月的数据框观察中筛选出来,然后将其另存为单独的数据框并用相应的年月命名。

如果有人能提出比下面的代码更有效的代码,我将不胜感激。此外,此代码未正确过滤观察结果。

data <- data.frame(year  = c(rep(2012,12),rep(2013,12),rep(2014,12),rep(2015,12),rep(2016,12)),
                   month = rep(1:12,5),
                   info = seq(60)*100)
years <- 2012:2016
months <- 1:12
for(year in years){
  for(month in months){
    
    data_sel <- data %>%
      filter(year==year & month==month)
    
    if(month<10){
      month_alt <- paste0("0",month) # months 1-9 should show up as 01-09
    }
    
    Newname <- paste0(year,month_alt,'_','data_sel')
    assign(Newname, data_sel)
  }
}

我希望获得的输出如下(包含给定年月数据的单独对象):

> ls()
 [1] "201201_data_sel" "201202_data_sel" "201203_data_sel" "201204_data_sel"
 [5] "201205_data_sel" "201206_data_sel" "201207_data_sel" "201208_data_sel"
 [9] "201209_data_sel" "201301_data_sel" "201302_data_sel" "201303_data_sel"
[13] "201304_data_sel" "201305_data_sel" "201306_data_sel" "201307_data_sel"
[17] "201308_data_sel" "201309_data_sel" "201401_data_sel" "201402_data_sel"
[21] "201403_data_sel" "201404_data_sel" "201405_data_sel" "201406_data_sel"
[25] "201407_data_sel" "201408_data_sel" "201409_data_sel" "201501_data_sel"
[29] "201502_data_sel" "201503_data_sel" "201504_data_sel" "201505_data_sel"
[33] "201506_data_sel" "201507_data_sel" "201508_data_sel" "201509_data_sel"
[37] "201601_data_sel" "201602_data_sel" "201603_data_sel" "201604_data_sel"
[41] "201605_data_sel" "201606_data_sel" "201607_data_sel" "201608_data_sel"
[45] "201609_data_sel" "data"            "data_sel"        "month"          
[49] "month_alt"       "months"          "Newname"         "year"           
[53] "years"

你可以这样做:

library(dplyr)

g <- data %>% 
  mutate(month = sprintf("%02d", month)) %>% 
  group_by(year, month) 

setNames(group_split(g), with(group_keys(g), paste0("data_sel_", year, month))) %>% 
  list2env(envir = .GlobalEnv)

R 中不允许对象名称以数字开头,因此在 paste0 中“data_sel_”是第一个。

如评论中所述,最好 通过管道传输到 list2env 并将输出存储为包含命名元素的列表。