【问题标题】:Getting first and last day of each month in R在R中获取每个月的第一天和最后一天
【发布时间】:2020-05-26 19:31:37
【问题描述】:

我需要在一个大数据框中获取每个月的第一天和最后一天的行,我需要使用 for 循环在其中应用准确覆盖每个月的操作。不幸的是,数据框不是很均匀。这是一个可重复的示例:

dataframe <- data.frame(Date=c(seq.Date(as.Date("2020-01-01"),as.Date("2020-01-31"),by="day"),
    seq.Date(as.Date("2020-02-01"),as.Date("2020-02-28"),by="day"),seq.Date(as.Date("2020-03-02"),
    as.Date("2020-03-31"),by="day")))

【问题讨论】:

    标签: r dataframe tidyverse lubridate


    【解决方案1】:

    我们可以通过转换成yearmon来创建一个分组列,然后得到第一个和最后一个

    library(zoo)
    library(dplyr)
    dataframe %>% 
       group_by(yearMon = as.yearmon(Date)) %>%
       summarise(FirstDay = first(Date), LastDay = last(Date))
    # A tibble: 3 x 3
    #  yearMon   First      Last      
    #* <yearmon> <date>     <date>    
    #1 Jan 2020  2020-01-01 2020-01-31
    #2 Feb 2020  2020-02-01 2020-02-28
    #3 Mar 2020  2020-03-02 2020-03-31
    

    如果是第一天和最后一天,与数据无关

    library(lubridate)
    dataframe %>% 
       group_by(yearMon = as.yearmon(Date)) %>%
       summarise(First = floor_date(first(Date), 'month'), 
                 Last = ceiling_date(last(Date), 'month')-1)
    

    【讨论】:

    • 谢谢!您能否告诉我如何应用从每个 FirstDay 开始并在 LastDay 应用后重复的循环??
    • @MrFrog 从总结来看,您可以使用purrr::map2%&gt;% mutate(new = map2(FirstDay, LastDay, ~ yourfun(.x, .y))
    • 不幸的是,我需要一个循环,因为每个月它都会改变一个应用函数的标准
    • @MrFrog 在这种情况下,如果汇总的输出是。 out &lt;- dataframe %&gt;% .. %&gt;% summarise(...),然后是lst1 &lt;- vector('list', nrow(out)); for(i in seq_along(lst1)) lst1[[i]] &lt;- yourfun(out$FirstDay[i], out$LastDay[i])
    • 该标准来自另一个具有相同列名和日期但内容不同的数据框。但是,我正在详细说明这一点。泰!
    猜你喜欢
    • 2019-03-04
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多