我有什么
我有一个数据集,我需要识别一系列药物的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))
答案 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