确定重叠方案的药物的开始和结束日期

时间:2016-07-13 05:41:16

标签: r date

我有什么

我有一个数据集,我需要识别一系列药物的start and end dates。患者可以开始服用一种药物,然后停止服用另一种药物,或者甚至再次服用第一种药物。

我需要什么

我需要每个事件的开始和结束日期。在某些情况下,两种药物在同一天开始并同时给药(在这些情况下,药物名称按行交替,但您可以从日期告知它们在同一时间段内给药)。

出于这个原因,我无法按药物名称排序,然后取出日期。

然后,我希望每个患者能够将数据重新整形为一行,每一轮药物的开始和结束日期。

我在下面的数据结构中包含了两个示例患者。

数据结构:

d <- structure(list(patient = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), 

date.administered = c("25-Jan-00", 
"3-Feb-00", "10-Feb-00", "17-Feb-00", "24-Feb-00", "2-Mar-00", 
"9-Mar-00", "16-Mar-00", "23-Mar-00", "31-Mar-00", "1-May-00", 
"9-May-00", "16-May-00", "30-May-00", "11-Jul-00", "18-Jul-00", 
"25-Jul-00", "1-Aug-00", "8-Aug-00", "15-Aug-00", "22-Aug-00", 
"25-Sep-00", "25-Sep-00", "3-Oct-00", "3-Oct-00", "12-Oct-00", 
"12-Oct-00", "19-Oct-00", "22-Nov-00", "1-Dec-00", "8-Dec-00", 
"22-Dec-00", "28-Dec-00", "5-Jan-01", "19-Jan-01", "24-Jan-01", 
"26-Jan-01", "31-Jan-01", "2-Feb-01", "14-Feb-01", "15-Feb-01", 
"23-Feb-01", "28-Feb-01", "2-Mar-01", "16-Mar-01", "23-Mar-01", 
"30-Mar-01", "12-Apr-01", "19-Apr-01", "25-Apr-01", "30-Mar-00", 
"5-Apr-00", "14-Apr-00", "18-Apr-00", "28-Apr-00", "4-May-00", 
"11-May-00", "26-May-00", "1-Jun-00", "9-Jun-00", "23-Jun-00", 
"30-Jun-00", "10-Jul-00", "21-Jul-00", "27-Jul-00", "3-Aug-00", 
"18-Aug-00", "25-Aug-00", "1-Sep-00", "18-Sep-00", "22-Sep-00", 
"29-Sep-00", "17-Oct-00", "23-Oct-00", "30-Oct-00", "14-Nov-00", 
"20-Nov-00", "27-Nov-00", "12-Dec-00", "18-Dec-00", "22-Dec-00", 
"24-Jan-01", "29-Jan-01", "6-Feb-01", "20-Feb-01", "26-Feb-01", 
"5-Mar-01", "20-Mar-01", "26-Mar-01", "2-Apr-01", "24-Apr-01", 
"30-Apr-01", "7-May-01", "22-May-01", "28-May-01", "4-Jun-01", 
"26-Jun-01", "29-Jun-01", "9-Jul-01", "24-Jul-01", "30-Jul-01", 
"3-Aug-01", "21-Aug-01", "27-Aug-01", "5-Sep-01", "18-Sep-01", 
"24-Sep-01", "1-Oct-01", "30-Oct-01", "5-Nov-01", "9-Nov-01", 
"27-Nov-01", "3-Dec-01", "10-Dec-01", "22-Jan-02", "28-Jan-02", 
"4-Feb-02", "16-Apr-02", "22-Apr-02", "29-Apr-02", "14-May-02", 
"17-May-02", "27-May-02", "11-Jun-02", "17-Jun-02", "24-Jun-02", 
"9-Jul-02", "15-Jul-02", "22-Jul-02", "6-Aug-02", "12-Aug-02", 
"19-Aug-02", "3-Sep-02", "9-Sep-02", "16-Sep-02", "8-Oct-02", 
"11-Oct-02", "21-Oct-02", "5-Nov-02", "8-Nov-02", "18-Nov-02", 
"3-Dec-02", "9-Dec-02", "16-Dec-02", "7-Jan-03", "13-Jan-03", 
"20-Jan-03", "4-Feb-03", "10-Feb-03", "17-Feb-03", "4-Mar-03", 
"10-Mar-03", "17-Mar-03", "1-Apr-03", "7-Apr-03", "14-Apr-03", 
"29-Apr-03", "5-May-03", "12-May-03", "17-Jun-03", "24-Jun-03", 
"2-Jul-03", "22-Oct-03", "22-Oct-03", "29-Oct-03", "29-Oct-03", 
"5-Nov-03", "5-Nov-03", "19-Nov-03", "19-Nov-03", "26-Nov-03", 
"26-Nov-03", "3-Dec-03", "3-Dec-03", "14-Jan-04", "14-Jan-04", 
"21-Jan-04", "21-Jan-04", "28-Jan-04", "28-Jan-04"), 

medication = c("G", 
"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", 
"G", "G", "G", "G", "G", "G", "G", "F", "L", "F", "L", "F", "L", 
"M", "G", "G", "G", "G", "G", "G", "G", "D", "G", "D", "G", "D", 
"G", "G", "D", "G", "G", "G", "G", "G", "G", "D", "G", "G", "G", 
"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", 
"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", 
"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", 
"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", 
"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", 
"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", 
"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", 
"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", 
"G", "G", "G", "G", "G", "C", "F", "C", "F", "C", "F", "C", "F", 
"C", "F", "C", "F", "C", "F", "C", "F", "C", "F")), 

.Names = c("patient", 
"date.administered", "medication"), class = "data.frame", row.names = c(NA, 
-180L))

3 个答案:

答案 0 :(得分:1)

试着将问题分解成更小的块。

第一部分是确定每种药物的开始和结束日期。

library(reshape2)
library(dplyr)

# Parse time stamp
d$parsed.date = as.Date(strptime(d$date.administered, format = "%d-%B-%y"))

# Get min and max dates per Patient per medication
d.filtered = d %>% 
  group_by(patient, medication) %>% 
  summarise(firstDate = min(parsed.date), lastDate = max(parsed.date)) %>% 
  ungroup()  %>% 
  mutate(firstDate = as.character(firstDate), lastDate = as.character(lastDate))

第二部分是重新格式化数据帧。并且dcast执行单行魔术

# Reformat data frame 
firstDate = dcast(data = d.filtered, formula = patient ~ medication, value.var ="firstDate")
lastDate = dcast(data = d.filtered, formula = patient ~ medication, value.var ="lastDate")

答案 1 :(得分:0)

假设我正确地理解了你的Q(在你想要的输出中有一个更小的例子会更好),看看这是否有帮助:

require(data.table) 
setDT(d)[ , list(medication = medication[1L], 
                 start = date.administered[1L], 
                 end = date.administered[.N]), 
by = rleid(patient, medication)]

rleid是关键所在。通过查看?rleid了解它的作用。简而言之,它为相同值的连续运行提供相同的数字(id)。我们按rleid创建的ID进行分组,并提取药物,开始和结束值。 .N是一个特殊符号,对应于每组中的观察总数。

PS:这假设每个患者中的date.administered列已经订购。

答案 2 :(得分:0)

只需扩展Aruns答案,即可将输出数据帧中的rleid转换回输入帧中的原始ID:

cardview