Background个
我收到了一个数据帧d
:
d <- data.frame(ID = c("a","a","a","a","a","a","a","b","b","c","c"),
treatment = c(0,1,0,0,0,1,0,1,0,1,1),
#event = c(0,0,1,1,1,1,1,0,1,1,1),
service_date = as.Date(c("2011-01-01",
"2011-08-21",
"2011-12-23",
"2012-02-23",
"2013-09-14",
"2013-04-07",
"2014-10-14",
"2013-01-01",
"2013-12-12",
"2014-06-17",
"2015-09-29")),
stringsAsFactors=FALSE)
> d
ID treatment service_date
1 a 0 2011-01-01
2 a 1 2011-08-21
3 a 0 2011-12-23
4 a 0 2012-02-23
5 a 0 2013-09-14
6 a 1 2013-04-07
7 a 0 2014-10-14
8 b 1 2013-01-01
9 b 0 2013-12-12
10 c 1 2014-06-17
11 c 1 2015-09-29
它描述了一些人(ID
),无论他们是否有treatment
,以及每个条目(行)的日期.
The Problem个
我想要计算第一行和最后treatment==1
行之间的平均持续时间,对于有超过1行的ID
,其中treatment==1
.
为了更清楚地说明这一点,让我们将这些步骤布置得就像是手动完成的一样,并查看我想要什么答案:
-
上
ID
号公路a号公路.A先生有7行数据,但只有两行treatment==1
:一行是2011-08-21(第二行),另一行是2013-09-14(第六行).如果你手工计算差额,你会发现两者之间有595天. -
对于
ID
b,我们什么都不做,因为他们只有1treatment==1
.(我们将使用filter
跳过代码中的b这样的人.) -
对于c先生,我们得到了469天的差额.
-
本组平均疗程:(595天+469天)/2人=532 days人.这就是我们想要的结果.
(我完全有可能做错了这个手工计算,这没什么,只要它足以理解我想要做什么即可.如果需要,我很乐意进一步澄清;请让我知道!)
What I've tried个
我正在try 修改类似查询中的一些旧代码,以实现以下目的:
d %>%
group_by(ID) %>%
filter(sum(treatment) >1) %>%
mutate(treatment_years = lubridate::time_length(max(service_date) - min(service_date), unit = "year")) %>%
ungroup() %>%
summarise(avg = mean(treatment_years),
sd = sd(treatment_years))
这段代码运行,并将我带到那里.它过滤掉不需要的IDs
个,并 for each 人计算一个定义的时间间隔的平均值(和SD).
但这并不完全正确:在lubridate::time_length
中,它没有指定条件"最大服务日期where 101"减go "最小服务日期where 101".(粗体部分是缺少的,也是需要的.)
我怎么才能让它做到这一点呢?
我try 过这样的操作,但它只是抛出了一个错误:
d %>%
group_by(ID) %>%
filter(sum(treatment) >1) %>%
mutate(treatment_years = lubridate::time_length(max(service_date) & treatment==1 - min(service_date) & treatment==1, unit = "year")) %>%
ungroup() %>%
summarise(avg = mean(treatment_years),
sd = sd(treatment_years))