【问题标题】:Create a loop with dates创建一个带日期的循环
【发布时间】:2021-11-27 21:40:25
【问题描述】:

我正在处理这样的数据集:

      date         time      solar
1  2019-05-17    11:20:00   710
2  2019-05-17    11:25:00   712
3  2019-05-17    11:30:00   787
.
.
.
70 2019-08-06    10:20:00   926
71 2019-08-06    10:25:00   204
72 2019-08-06    10:30:00   498
.
.
.
90 2020-01-17    10:20:00   936
91 2020-01-17    10:25:00   639
92 2020-01-17    10:30:00   876

在第一列中,我有日期,从 2019 年 5 月 17 日到 2021 年 9 月 10 日的每一天,我想为每个月创建一个新数据集,例如我想要一个包含所有相同的数据,但仅适用于 2020 年 1 月,并且每个月都重复此操作……我就是这样工作的:

首先使用library(tibbletime) 将我的数据框(df1)转换为:

df_t<- as_tbl_time(df1, index = date) 

然后用:

may19 <- filter_time(df_t, ~'2019-05')
jun19 <- filter_time(df_t, ~'2019-06')
jul19 <- filter_time(df_t, ~'2019-07')
ago19 <- filter_time(df_t, ~'2019-08')
sep19 <- filter_time(df_t, ~'2019-09')
oct19 <- filter_time(df_t, ~'2019-10')
nov19 <- filter_time(df_t, ~'2019-11')
dic19 <- filter_time(df_t, ~'2019-12') 

创建一个新数据集,在其中我只使用我想要的月份的信息过滤 df_t,问题是我从 2019 年到 2021 年的每个月都这样做,我希望以更简单的方式来做例如一个循环,问题是我不知道如何,因为如果我执行循环,我不能将 i 放入:'2019-i',因为它不起作用。

【问题讨论】:

    标签: r loops date


    【解决方案1】:

    我会使用 dplyr 按年份和月份的组合对您的数据框进行分组,然后拆分这些组,这样您就有一个数据框/小标题列表,每个月一个。像这样的...

    首先我将加载两个包并创建一些虚拟数据:

    library(lubridate)
    library(dplyr)
    
    dates <- seq(ymd("2015-12-01"), ymd("2021-12-01"), by = "days")
    
    df <- tibble(date = dates,
                 value = rnorm(length(dates)))
    

    接下来我创建月/年列并使用它们来拆分数据框:

    month_list <- df %>%
      mutate(date = as_date(date),
             year = year(date),
             month = month(date)) %>%
      group_by(year, month) %>%
      group_split()
    

    根据您的日期列的设置方式,as_date() 应该可以工作,或者可能没有必要。

    这将为您提供一个小标题列表,每个小标题对应一个特定的月份。您可以通过索引单独访问它们,例如month_list[[1]]

    您可能希望将月-年组合分配给列表中每个元素的“名称”。这将使访问您想要的特定月份变得更加容易(类似于您将个人 dfs 命名为“Dec19”、“Jan20”等)。在这里,我遍历列表并从数据框中的月份和年份列中提取第一个值,并将其设置为该元素的名称:

    names(month_list) <- lapply(month_list, function(x){
    
       m <- x$month[1]
       y <- x$year[1]
    
       name <- paste(m,y, sep = "-")
    
       return(name)
    
    })
    

    这将允许您通过引用月份-年份来访问适当的数据框,如下所示:

    month_list["1-2016"]
    

    month_list$`1-2016`
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-18
      • 2012-12-26
      • 2021-10-06
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      相关资源
      最近更新 更多