【问题标题】:create a new variable based on multiple conditions in r根据 r 中的多个条件创建一个新变量
【发布时间】: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-01time.to.event 应该是 7302015-01-01 减去 2013-01-01)。

对于id = 2,第一次事故的日期是2014-01-01; 首次入院日期为2013-01-01time.to.event 应该是 3652014-01-01 减去 2013-01-01)。

对于id = 3,第一次事故的日期是2013-01-01; 首次入院日期为2013-01-01time.to.event 应该是 02013-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

    标签: r date dplyr


    【解决方案1】:

    我们可以用which 包装或使用match 来获取值为1 的索引

    df %>% group_by(id) %>% mutate(time_to_event = date[match(1, outcome)] - min(date))
    

    【讨论】:

      猜你喜欢
      • 2022-07-15
      • 1970-01-01
      • 2021-11-03
      • 2022-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      相关资源
      最近更新 更多