【发布时间】:2022-08-13 00:02:41
【问题描述】:
我不知道如何根据多个条件创建一个新变量。
这个例子可以解释我的问题。
有3个主要变量。
id 表示人。相同的id 表示相同的人。
date 表示入院日期。
outcome 表示一个人是否患有特定疾病。 1 表示有病,0 表示没有病。
df = data.frame(
id = c(1,1,1,1, 2,2,2,2, 3,3,3,3),
date = c(\'2013-01-01\', \'2014-01-01\', \'2015-01-01\', \'2016-01-01\',
\'2013-01-01\', \'2014-01-01\', \'2015-01-01\', \'2016-01-01\',
\'2013-01-01\', \'2014-01-01\', \'2015-01-01\', \'2016-01-01\'),
outcome = c(0,0,1,1, 0,1,0,0, 1,1,0,0)
) %>%
mutate(date = as.Date(date)) %>%
as_tibble()
# A tibble: 12 × 3
id date outcome
<dbl> <date> <dbl>
1 1 2013-01-01 0
2 1 2014-01-01 0
3 1 2015-01-01 1
4 1 2016-01-01 1
5 2 2013-01-01 0
6 2 2014-01-01 1
7 2 2015-01-01 0
8 2 2016-01-01 0
9 3 2013-01-01 1
10 3 2014-01-01 1
11 3 2015-01-01 0
12 3 2016-01-01 0
我想创建一个新变量time.to.event,表示第一次事故日期和第一次住院日期之间的时间差。
例如:
对于id = 1,第一次事故的日期是2015-01-01;
首次入院日期为2013-01-01。
time.to.event 应该是 730(2015-01-01 减去 2013-01-01)。
对于id = 2,第一次事故的日期是2014-01-01;
首次入院日期为2013-01-01。
time.to.event 应该是 365(2014-01-01 减去 2013-01-01)。
对于id = 3,第一次事故的日期是2013-01-01;
首次入院日期为2013-01-01。
time.to.event 应该是 0(2013-01-01 减去 2013-01-01)。
我尝试了下面的代码但失败了。
df %>%
group_by(id) %>%
mutate(
first.outcome.date = across(where(outcome == 1), ~ min(date)),
base.date = min(date)) %>%
mutate(
time.to.event = first.outcome.date - base.date)
最终数据应该是这样的:
# A tibble: 12 × 4
id date outcome time.to.event
<dbl> <date> <dbl> <dbl>
1 1 2013-01-01 0 730
2 1 2014-01-01 0 730
3 1 2015-01-01 1 730
4 1 2016-01-01 1 730
5 2 2013-01-01 0 365
6 2 2014-01-01 1 365
7 2 2015-01-01 0 365
8 2 2016-01-01 0 365
9 3 2013-01-01 1 0
10 3 2014-01-01 1 0
11 3 2015-01-01 0 0
12 3 2016-01-01 0 0