Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 定义具有重叠和串联时间间隔的展示周期/情节_R_Time_Data.table_Intervals - Fatal编程技术网

R 定义具有重叠和串联时间间隔的展示周期/情节

R 定义具有重叠和串联时间间隔的展示周期/情节,r,time,data.table,intervals,R,Time,Data.table,Intervals,我试图通过处方确定药物暴露的时期/发作。如果这些处方分开30天,则被视为一个新的暴露期/事件。处方可以在特定时间重叠,也可以是连续的。如果连续两次处方的间隔天数之和大于30天,则不视为新的发作 我有这样的数据: id = c(rep(1,3), rep(2,6), rep(3,5)) start = as.Date(c("2017-05-10", "2017-07-28", "2017-11-23", "2017-01-27&

我试图通过处方确定药物暴露的时期/发作。如果这些处方分开30天,则被视为一个新的暴露期/事件。处方可以在特定时间重叠,也可以是连续的。如果连续两次处方的间隔天数之和大于30天,则不视为新的发作

我有这样的数据:

id = c(rep(1,3), rep(2,6), rep(3,5))
start = as.Date(c("2017-05-10", "2017-07-28", "2017-11-23", "2017-01-27", "2017-10-02", "2018-05-14", "2018-05-25", "2018-11-26", "2018-12-28", "2016-01-01", "2016-03-02", "2016-03-20", "2016-04-25", "2016-06-29"))
end = as.Date(c("2017-07-27", "2018-01-28", "2018-03-03", "2017-04-27", "2018-05-13", "2018-11-14", "2018-11-25", "2018-12-27", "2019-06-28", "2016-02-15", "2016-03-05", "2016-03-24", "2016-04-29", "2016-11-01"))

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

DT
    id      start        end
 1:  1 2017-05-10 2017-07-27
 2:  1 2017-07-28 2018-01-28
 3:  1 2017-11-23 2018-03-03
 4:  2 2017-01-27 2017-04-27
 5:  2 2017-10-02 2018-05-13
 6:  2 2018-05-14 2018-11-14
 7:  2 2018-05-25 2018-11-25
 8:  2 2018-11-26 2018-12-27
 9:  2 2018-12-28 2019-06-28
10:  3 2016-01-01 2016-02-15
11:  3 2016-03-02 2016-03-05
12:  3 2016-03-20 2016-03-24
13:  3 2016-04-25 2016-04-29
14:  3 2016-06-29 2016-11-01
我计算了开始观察和最后观察的差异(最后几天)

这将显示何时发生重叠(负值)或不发生重叠(正值)。我认为在这里使用ifelse/fcase语句是个坏主意,我不喜欢这样做

我认为这项工作的良好输出应该是:

    id      start        end last_diffdays noexp_days period
 1:  1 2017-05-10 2017-07-27        0 days          0      1
 2:  1 2017-07-28 2018-01-28        1 days          1      1
 3:  1 2017-11-23 2018-03-03      -66 days          0      1
 4:  2 2017-01-27 2017-04-27        0 days          0      1
 5:  2 2017-10-02 2018-05-13      158 days        158      2
 6:  2 2018-05-14 2018-11-14        1 days          1      2
 7:  2 2018-05-25 2018-11-25     -173 days          0      2
 8:  2 2018-11-26 2018-12-27        1 days          1      2
 9:  2 2018-12-28 2019-06-28        1 days          1      2
10:  3 2016-01-01 2016-02-15        0 days          0      1
11:  3 2016-03-02 2016-03-05       16 days         16      1
12:  3 2016-03-20 2016-03-24       15 days         15      1
13:  3 2016-04-25 2016-04-29       32 days         32      2
14:  3 2016-06-29 2016-11-01       61 days         61      3
我手工计算了处方前未暴露的天数(noexp_天数)

我不知道我的路径是否正确,但我认为我需要计算noexp\u days变量,然后生成一个
cumsum((noexp\u days)>30)+1

如果有一个更好的解决方案,我没有看到或任何其他可能性,我没有考虑过,我将感谢阅读他们

提前感谢您的帮助!:)

试试看:

library(data.table)

DT[, noexp_days := pmax(as.integer(last_diffdays), 0)]
DT[, period := cumsum(noexp_days > 30) + 1, id]
DT
#    id      start        end last_diffdays noexp_days period
# 1:  1 2017-05-10 2017-07-27        0 days          0      1
# 2:  1 2017-07-28 2018-01-28        1 days          1      1
# 3:  1 2017-11-23 2018-03-03      -66 days          0      1
# 4:  2 2017-01-27 2017-04-27        0 days          0      1
# 5:  2 2017-10-02 2018-05-13      158 days        158      2
# 6:  2 2018-05-14 2018-11-14        1 days          1      2
# 7:  2 2018-05-25 2018-11-25     -173 days          0      2
# 8:  2 2018-11-26 2018-12-27        1 days          1      2
# 9:  2 2018-12-28 2019-06-28        1 days          1      2
#10:  3 2016-01-01 2016-02-15        0 days          0      1
#11:  3 2016-03-02 2016-03-05       16 days         16      1
#12:  3 2016-03-20 2016-03-24       15 days         15      1
#13:  3 2016-04-25 2016-04-29       32 days         32      2
#14:  3 2016-06-29 2016-11-01       61 days         61      3
library(data.table)

DT[, noexp_days := pmax(as.integer(last_diffdays), 0)]
DT[, period := cumsum(noexp_days > 30) + 1, id]
DT
#    id      start        end last_diffdays noexp_days period
# 1:  1 2017-05-10 2017-07-27        0 days          0      1
# 2:  1 2017-07-28 2018-01-28        1 days          1      1
# 3:  1 2017-11-23 2018-03-03      -66 days          0      1
# 4:  2 2017-01-27 2017-04-27        0 days          0      1
# 5:  2 2017-10-02 2018-05-13      158 days        158      2
# 6:  2 2018-05-14 2018-11-14        1 days          1      2
# 7:  2 2018-05-25 2018-11-25     -173 days          0      2
# 8:  2 2018-11-26 2018-12-27        1 days          1      2
# 9:  2 2018-12-28 2019-06-28        1 days          1      2
#10:  3 2016-01-01 2016-02-15        0 days          0      1
#11:  3 2016-03-02 2016-03-05       16 days         16      1
#12:  3 2016-03-20 2016-03-24       15 days         15      1
#13:  3 2016-04-25 2016-04-29       32 days         32      2
#14:  3 2016-06-29 2016-11-01       61 days         61      3