【问题标题】:Estimate gaps between multiple dates估计多个日期之间的间隔
【发布时间】:2016-09-08 02:45:16
【问题描述】:

有没有办法找到多个时间线之间的差距。例如我的数据如下所示:

library(plyr);library(dplyr)
library(googleVis)

df <- data.frame(Language = structure(c(rep("English",7), rep("German",5), rep("French", 10)), class = "character"),
                 Students = c(LETTERS[1:7], LETTERS[1:5], LETTERS[1:10]), 
                 Start = structure(c(16713,16713,16713,16744,16713,16714,16754,16729,16729,16729,16750,16769,
                                     16724,16724,16745,16724,16759,16766,16723,16722,16736,16796), class = "Date"), 
                 End = structure(c(16762,16720,16762,16755,16720,16764,16762,16765,16765,16749,16761,16770,16758,
                                   16744,16758,16764,16765,16766,16726,16723,16758,16806), class = "Date"))

ddply(df, .(Language), summarise,
      FirstDay = min(Start),
      LastDay = max(End), 
      Duration = LastDay - FirstDay)

plot(gvisTimeline(data=df, rowlabel = "Class", start = "Start", end = "End", options=list(width=600, height=1000) ))

当没有学生上课时,我正在计算差距。差距在下图中以红色突出显示。

【问题讨论】:

    标签: r dplyr plyr lubridate


    【解决方案1】:

    这是一个相当经典的问题。有关此问题的解决方案是根据开始日期是否大于先前的最大结束日期来过滤行,假设行事先按开始日期排序。 lag 函数和cummax() 可以用来找出之前的最大结束日期,由于 cummax() 没有为 Date 类定义,我们可以将其转换为整数,应用 cummax 然后将其转换回来:

    library(dplyr)
    df %>% 
           arrange(Start) %>% group_by(Language) %>% 
           mutate(End_Max = lag(as.Date(cummax(as.integer(End)), "1970-01-01"))) %>% 
           filter(Start > End_Max + 1) %>% select(Language, End_Max, Start)
    
    # Source: local data frame [2 x 3]
    # Groups: Language [2]
    
    #  Language    End_Max      Start
    #    <fctr>     <date>     <date>
    #1   German 2015-11-26 2015-11-30
    #2   French 2015-11-27 2015-12-27
    

    【讨论】:

      猜你喜欢
      • 2015-08-06
      • 1970-01-01
      • 2023-04-10
      • 2012-10-28
      • 2012-03-26
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多