首页 文章

在一段时间内计数

提问于
浏览
-2

我有以下数据框:人员A有5个假期,第一个假期是2015-03-11到2015-03-15,以及人员A从2016-02-04到2016-02-10的最后一个假期 .

Person   fromDate    toDate
A        2015-03-11  2015-03-15
A        2015-04-17  2015-06-16
A        2015-09-18  2015-10-12
A        2015-12-18  2016-01-02
A        2016-02-04  2016-02-10
B        2015-04-10  2016-04-16
B        2016-12-12  2016-12-20
C        2015-01-02  2015-02-04
C        2015-03-03  2015-03-05
C        2015-04-04  2015-04-07
C        2016-01-03  2016-01-10
C        2016-10-12  2016-10-15
C        2016-11-01  2016-11-05

我想找到所有在365天内至少休假5次的人 . 在上面的例子中,人A在365天休假5次 . C人去了6个假期但不是365天 . 结果应该是一个数据帧

Person   at_least_five_vacations_within_365_days
A          TRUE
B          FALSE
C          FALSE

3 回答

  • 0

    你的数据:

    library(data.table)
    library(lubridate)
    df <- fread("Person\tfromDate\ttoDate
              A\t2015-03-11\t2015-03-15
              A\t2015-04-17\t2015-06-16
              A\t2015-09-18\t2015-10-12
              A\t2015-12-18\t2016-01-02
              A\t2016-02-04\t2016-02-10
              B\t2015-04-10\t2016-04-16
              B\t2016-12-12\t2016-12-20
              C\t2015-01-02\t2015-02-04
              C\t2015-03-03\t2015-03-05
              C\t2015-04-04\t2015-04-07
              C\t2016-01-03\t2016-01-10
              C\t2016-10-12\t2016-10-15
              C\t2016-11-01\t2016-11-05",header="auto",sep="auto") %>% 
              as.data.frame() %>%
              mutate(fromDate=ymd(fromDate), toDate=ymd(toDate))
    

    设置 number of trips 窗口:

    numoftrips <- 5
    

    使用 dpylr 并假设您的日期已按 Person 排序

    library(dplyr)
    df1 <- df %>% 
      group_by(Person) %>% 
      mutate(toCompare=lead(toDate,(numoftrips-1))) %>%         # Copy return date of 5th-trip-after as new column
      mutate(within.year=(toCompare-fromDate)<=365) %>%         # Check if difference is less than 365 days
      summarise(at_least_five_vacations_within_365_days=ifelse(sum(within.year,na.rm=T)>0,TRUE,FALSE))  # If taken 5 trips in less than 365 days, return TRUE
    

    产量

    df1
      Person too.many.vacay
    1      A           TRUE
    2      B          FALSE
    3      C          FALSE
    
  • 0

    这可能会奏效 . 但是你应该指定预期的输出 .

    library(dplyr)
    df %>% group_by(Person) %>%
           mutate(diff = toDate - fromDate,instances = n())%>%
           filter (instances >=5 & diff < 356)
    

    df 只是您的数据集,而实例是人的访问次数

  • 0

    accepted answer使用 data.table 来读取数据,但继续使用 dplyr 方法 .

    下面的方法使用 readr 包中的 read_table2() ,但使用 data.table "one-liner"实现了所需的结果:

    library(data.table)   # CRAN version 1.10.4 used
    n_trips <- 5L
    n_days <- 365L
    DT[order(Person, fromDate), 
       any(fromDate <= shift(toDate, n_trips - 1L, , "lag") + n_days, na.rm = TRUE), 
       by = Person][]
    

    人V1
    1:是的
    2:B FALSE
    3:C FALSE

    解释

    该方法类似于接受的答案: toDate 滞后于所需的人数,然后检查实际 fromDate 是否在给定的天数范围内 . any() 函数用于确定特定人员是否至少出现一次 . 移位操作的结果取决于行的顺序 . 因此,data.table是事先订购的 .

    OP已要求查找所有在365天内至少休假5次的人,但他没有明确说明如何计算假期(按开始日期,结束日期或两者兼而有之?) . 因此,故意选择检查第4次假期的结束日期与实际假期的开始日期 .

    数据

    DT <- readr::read_table2(
    "Person   fromDate    toDate
    A        2015-03-11  2015-03-15
    A        2015-04-17  2015-06-16
    A        2015-09-18  2015-10-12
    A        2015-12-18  2016-01-02
    A        2016-02-04  2016-02-10
    B        2015-04-10  2016-04-16
    B        2016-12-12  2016-12-20
    C        2015-01-02  2015-02-04
    C        2015-03-03  2015-03-05
    C        2015-04-04  2015-04-07
    C        2016-01-03  2016-01-10
    C        2016-10-12  2016-10-15
    C        2016-11-01  2016-11-05"
    )
    library(data.table)
    setDT(DT)
    

相关问题