在一段时间内计数

时间:2017-07-18 15:09:55

标签: r

我有以下数据框: A人休假5次,第一次假期是2015-03-11至2015-03-15,以及2016-02-04至2016-02-10之间人员A的最后一次假期。

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 :(得分:0)

这可能有用。但是你应该指定预期的输出。

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

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

答案 1 :(得分: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&amp;假设您的日期已经按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

答案 2 :(得分:0)

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

以下方法使用read_table2()包中的readr,但使用data.table“单行”获得了所需的结果:

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][]
   Person    V1
1:      A  TRUE
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)