【问题标题】:Add rows of no exposed periods (gaps) of a time interval添加时间间隔的无暴露时段(间隙)的行
【发布时间】:2021-07-17 11:39:56
【问题描述】:

我正在尝试为Self-Controlled Study 格式化数据。我在两个日期内有一段时间的学习:

cohort_start = as.Date("01/01/2015", "%d/%m/%Y")
cohort_end  = as.Date("01/01/2020", "%d/%m/%Y")

我有不同时期接触药物的身份证:

id = c(rep(1,2),2)
start = as.Date(c("10/09/2015","22/04/2018", "08/06/2017"), "%d/%m/%Y" )
end = as.Date(c("31/01/2016","17/02/2019", "03/11/2018"), "%d/%m/%Y" )
exp = rep(1,3)

DT = data.table(id, start, end, exp)

DT
   id      start        end exp
1:  1 2015-09-10 2016-01-31   1
2:  1 2018-04-22 2019-02-17   1
3:  2 2017-06-08 2018-11-03   1

如果 id 没有像期望的输出那样暴露于药物,我想根据间隔/期间添加观察结果:

   id      start        end exp
1:  1 2015-01-01 2015-09-09   0
2:  1 2015-09-10 2016-01-31   1
3:  1 2016-02-01 2018-04-21   0
4:  1 2018-04-22 2019-02-17   1
5:  1 2019-02-18 2020-01-01   0
6:  2 2015-01-01 2018-06-07   0
7:  2 2017-06-08 2018-11-03   1
8:  2 2018-11-04 2020-01-01   0

我现在没有任何线索......

任何帮助都会得到认可,

提前谢谢你!

【问题讨论】:

  • 所需输出的最后一行似乎在startexp 中有拼写错误..

标签: r time data.table intervals


【解决方案1】:
# Create data.table with all dates in period 2015-01-01 >> 2020-01-01
# for each id
DT.all <- CJ(id   = unique(DT$id), 
             date = seq( as.Date("2015-01-01"), as.Date("2020-01-01"), by = 1))
# Join in data
DT.all[DT, exp := i.exp, on = .(id, date >= start, date <= end)]
# Create groups
DT.all[, group := rleid(id,exp)]
# Summarise by id and just created groups
ans <- DT.all[, .(start = min(date), end = max(date), exp = unique(exp)), by = .(id,group)]
# Replace NA-=exp with 0
ans[is.na(exp), exp := 0][]
#    id group      start        end exp
# 1:  1     1 2015-01-01 2015-09-09   0
# 2:  1     2 2015-09-10 2016-01-31   1
# 3:  1     3 2016-02-01 2018-04-21   0
# 4:  1     4 2018-04-22 2019-02-17   1
# 5:  1     5 2019-02-18 2020-01-01   0
# 6:  2     6 2015-01-01 2017-06-07   0
# 7:  2     7 2017-06-08 2018-11-03   1
# 8:  2     8 2018-11-04 2020-01-01   0

【讨论】:

  • 我也学到了你展示给我的所有新东西,但这正是我想要的。谢谢!
猜你喜欢
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2011-01-20
相关资源
最近更新 更多