我有以下数据框: 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
答案 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)