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

R 确定重叠方案药物的开始和结束日期,r,date,R,Date,我拥有的 我有一个数据集,需要识别一系列药物的开始和结束日期。患者可能开始服用一种药物,然后停止服用并开始另一种药物,甚至再次开始第一种药物 我需要什么 我需要这些活动的开始和结束日期。在某些情况下,两种药物在同一日期开始并同时服用(在这些情况下,药物名称按行交替,但从日期可以看出它们是在同一时间段服用的) 由于这个原因,我无法按药物名称排序,然后提取日期 然后,我希望能够将数据重塑为每名患者一行,并提供每轮药物治疗的开始和结束日期 我在下面的数据结构中包括了两个示例患者 数据结构: d <

我拥有的

我有一个数据集,需要识别一系列药物的开始和结束日期。患者可能开始服用一种药物,然后停止服用并开始另一种药物,甚至再次开始第一种药物

我需要什么

我需要这些活动的开始和结束日期。在某些情况下,两种药物在同一日期开始并同时服用(在这些情况下,药物名称按行交替,但从日期可以看出它们是在同一时间段服用的)

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

然后,我希望能够将数据重塑为每名患者一行,并提供每轮药物治疗的开始和结束日期

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

数据结构:

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))

d试着把问题分解成更小的部分

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

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")

试着把问题分成更小的部分

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

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")

假设我正确理解了您的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.administrated
列已经订购。

假设我正确理解您的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.administrated
列已经订购。

仅在Aruns答案上展开,以便将rleid从输出数据帧转换回输入帧中的原始ID:

# this is what Arun does, the actual transformation
d2 <- d[ , list(medication = medication[1L], 
                 start = date.administered[1L], 
                 end = date.administered[.N]), 
by = rleid(patient, medication)]


# and then we add a group-identifier of the rleid to the old dataset
d[ , rleid := .GRP,
by = rleid(patient, medication)]

# and then we map those rleids to the ids to the output data
d2[, patient := plyr::mapvalues(rleid, from=d$rleid, to=d$patient)]
#这就是阿伦所做的,实际的转变

d2仅扩展Aruns答案,以便将输出数据帧中的rleid转换回输入帧中的原始ID:

# this is what Arun does, the actual transformation
d2 <- d[ , list(medication = medication[1L], 
                 start = date.administered[1L], 
                 end = date.administered[.N]), 
by = rleid(patient, medication)]


# and then we add a group-identifier of the rleid to the old dataset
d[ , rleid := .GRP,
by = rleid(patient, medication)]

# and then we map those rleids to the ids to the output data
d2[, patient := plyr::mapvalues(rleid, from=d$rleid, to=d$patient)]
#这就是阿伦所做的,实际的转变

d2我认为您需要将其分解为一个小得多的示例,然后提供预期的输出。例如,2名患者服用3行2种药物,总共约12行。或者至少给出这个更大集合的预期结果,因为不清楚什么定义了任何特定药物的开始或停止。您好,谢谢您的回复。如果我不清楚的话,我会第一次发帖道歉。药物的开始和停止有点难以定义,但我最好的尝试是,在使用新药物之前,它是药物的最小和最大日期。如前所述,在某些情况下,两种药物可同时使用。所以我们需要这两种药物的开始和结束日期。我将尝试缩小数据集并尽快提供预期输出。我认为您需要将其分解为一个更小的示例,然后提供预期输出。例如,2名患者服用3行2种药物,总共约12行。或者至少给出这个更大集合的预期结果,因为不清楚什么定义了任何特定药物的开始或停止。您好,谢谢您的回复。如果我不清楚的话,我会第一次发帖道歉。药物的开始和停止有点难以定义,但我最好的尝试是,在使用新药物之前,它是药物的最小和最大日期。如前所述,在某些情况下,两种药物可同时使用。所以我们需要这两种药物的开始和结束日期。我将尝试缩小数据集,并尽快提供预期的输出。您好,非常感谢您的回复和脚本。它非常接近我需要的东西。在您对药物进行分组的地方,我需要从数据中获得更多的细节。我想区分每个患者的每种药物的单独疗程。例如,在患者1中,他们实际上有2个疗程的药物g(即:00年1月25日至8月22日和00年11月22日至2001年4月19日)。是否有可能在脚本中构建某种可变阈值(x)来表示x>n(天),它将药物分为第二、第三、第四等疗程。接受所有建议。事实上,这可能会有问题,因为一些患者可能有更长的用药周期,因此阈值可能不适用于所有患者。但这可能是一个很好的起点?原则上,您可以在函数中定义逻辑,该函数接收日期并返回所需的日期。然后您可以使用上面的代码,但是除了使用
min
max
之外,您还可以使用
摘要(firstDate=yourCustomFunction1(parsed.date),lastDate=yourCustomFunction2(parsed.date))
您好,非常感谢您的回复和脚本。它非常接近我需要的东西。在您对药物进行分组的地方,我需要从数据中获得更多的细节。我想去看电影