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))
您好,非常感谢您的回复和脚本。它非常接近我需要的东西。在您对药物进行分组的地方,我需要从数据中获得更多的细节。我想去看电影