【问题标题】:R - get all the calendar years between two datesR - 获取两个日期之间的所有日历年
【发布时间】:2016-06-30 22:47:42
【问题描述】:

我有一个数据框,其中包含一个包含开始日期的列和一个包含结束日期的列。我想知道是否有一种体面的 R 方式,从 base-R 获取这两个日期(包括)之间的所有日历年。

我有一个解决方法

seq(as.numeric(format(as.Date(df$start[1]), '%Y')), 
      as.numeric(format(as.Date(df$end[1]), '%Y')), by = 1)

但我想要一些可以将整个向量传递给的东西。

如果我在其中传递seq 函数,我想我可以使用apply,但这是要走的路吗?我试图达到的最终结果是每个日历年有多少条目“活跃”的直方图。任何帮助表示赞赏。谢谢。

【问题讨论】:

    标签: r date calendar dataframe


    【解决方案1】:

    只需使用年度序列:

    sd = as.Date("1990-01-01")
    ed = as.Date("1995-01-01")
    
    substr(seq(sd, ed, "years"), 1, 4)
    

    这会给你输出[1] "1990" "1991" "1992" "1993" "1994" "1995"

    编辑:

    您可以将其包装在一个函数中并使用mapply,这样您就可以传递整个向量。

    sd = as.Date(c("1990-01-01", "1990-01-01", "1993-01-01", "1992-01-01"))
    ed = as.Date(c("1995-01-01", "2000-01-01", "2001-01-01", "1998-01-01"))
    
    yearser = function(sd, ed){
        substr(seq(sd, ed, "years"), 1, 4)
    }
    
    mapply(function(x, y) yearser(x, y), sd, ed)
    

    当然,mapply 的这种方法也适用于您原来的解决方法。

    【讨论】:

    • 嗨。谢谢回复。嗯,这部分我已经想通了。确实,您使用substr 而不是像我一样强制/格式化,我们得到相同的结果,但问题是数据库之间的日期格式不同,因此必须保持更通用。知道如何将它应用于整个向量吗?
    • 我编辑了帖子,以便可以将函数应用于向量。
    • 是的。谢谢你。现在我只需要创建一个“真值表”,列数是sded 之间的最长序列,类似于:min_year = as.numeric(format(as.Date(min(as.vector(sd))), '%Y')) max_year = as.numeric(format(as.Date(max(as.vector(ed))), '%Y')) min_max = seq(min_year, max_year, by = 1) 并将其传递给您的函数:yearser = function(seq_min_max, sd, ed) { min_max %in% seq(as.numeric(format(as.Date(sd), '%Y')), as.numeric(format(as.Date(ed), '%Y')), by = 1) }
    • 我选择您的答案作为正确答案,以使其适用于向量和mapply 的使用。谢谢
    猜你喜欢
    • 2013-08-09
    • 2012-07-04
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多