有人在Reddits / r / Rlanguage上命名为Tarqon解决了这个问题。 1 + cumsum(days_between> = 45而不是if_else。
group_by(DMHID) %>%
arrange(DMHID, DateOfService) %>%
mutate(days_between = as.numeric(DateOfService - lag(DateOfService, default = DateOfService[1]))) %>%
mutate(eoc_45dco = 1 + cumsum(days_between >= 45)) %>%
mutate(id_eoc = as.integer(paste0(DMHID, eoc_45dco))) %>%
原始问题
所以我试图根据一次访问和下一次访问之间的天数(> 45)来分割案例。当一次访问与下一次访问之间的时间超过45天时,它适用于单个实例,但我需要在每次访问之后成为第二组的一部分。例如,参与者1234有362次访问,但在访问105(2016-12-26)和106(2017-02-23)之间有59天的差距所以我希望之后的所有案例都被标记为2.而不是所有案例导致并包括105的是12341,之后是12342,因此我可以将此变量分组以供以后分析。问题是我似乎只能将第106次访问标记为12342,之前和之后的所有内容都是12341.我创建了一个精简的数据集和脚本,可以重现问题。
https://www.dropbox.com/s/k6gvo8igvbhpgti/reprex.zip?dl=0
编辑:我只想到另一种说法。我基本上需要弄清楚如何为每个人分组/子集数据,分界线是第一次有45天或更长的差距。我可能会使用我当前的实现走错路,所以如果您可以建议其他方式以我想要的方式拆分数据,请告诉我。在示例中,我只有一个人访问,因此完整数据集中有几千人有类似的问题。barometer <- df_pdencs_orig %>%
select(-EncID, -SiteName, -EOCKey, -ProgramLevel, -ProgramLevelCode, -ProcedureDesc, -MedicationValue, -CheckDate, -PdAmount, -PayerType) %>%
mutate_at(vars(contains("Date")), funs(ymd)) %>%
filter(DMHID %in% valid_diag$DMHID & DateOfService >= ymd(open_date)) %>%
group_by(DMHID) %>%
arrange(DMHID, DateOfService) %>%
mutate(days_between = DateOfService - lag(DateOfService, n = 1, default = DateOfService[1])) %>%
mutate(eoc_45dco = 1) %>%
mutate(eoc_45dco = if_else(days_between >= 45, lag(eoc_45dco) + 1, eoc_45dco)) %>%
mutate(eoc_45dco2 = if_else(lag(eoc_45dco) > 1, eoc_45dco + 1, eoc_45dco)) %>%
mutate(id_eoc = as.integer(paste0(DMHID, eoc_45dco))) %>%
...
下面的代表工作正常,所以我认为这没有帮助。
library(tidyverse)
library(lubridate)
#>
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#>
#> date
df <- data.frame(
date = sample(seq(as.Date('2016/06/01'), as.Date('2017/03/01'), by="day"), 11),
days = as.difftime(c(40:50), units = "days")
)
df %>%
mutate(id = 1234) %>%
arrange(days) %>%
mutate(Z = 1) %>%
mutate(Z = if_else(days >= 45, lag(Z) + 1, Z)) %>%
mutate(id_eoc = as.integer(paste0(id, Z)))
#> date days id Z id_eoc
#> 1 2016-06-30 40 days 1234 1 12341
#> 2 2016-11-25 41 days 1234 1 12341
#> 3 2016-09-09 42 days 1234 1 12341
#> 4 2017-01-16 43 days 1234 1 12341
#> 5 2016-08-16 44 days 1234 1 12341
#> 6 2016-09-23 45 days 1234 2 12342
#> 7 2016-09-05 46 days 1234 2 12342
#> 8 2016-08-29 47 days 1234 2 12342
#> 9 2016-07-08 48 days 1234 2 12342
#> 10 2017-01-11 49 days 1234 2 12342
#> 11 2017-02-22 50 days 1234 2 12342
由reprex package(v0.2.0)创建于2018-04-17。
因此我认为问题在于日期可能因为减去日期会给出时间变量而不是整数。