我有一个数据集如下
patient number drugtype date date - 1 year date + 1 year
11 G5 1/1/15 1/1/14 1/1/16
16 G5 5/4/13 5/4/12 5/4/14
19 R6 2/1/12 2/1/11 2/1/13
11 G5 7/4/14 7/4/13 7/4/15
19 R6 4/6/11 4/6/10 4/6/12
16 G5 3/2/12 3/2/11 3/2/13
32 G5 2/4/14 2/4/13 2/4/15
11 G5 1/1/10 1/1/9 1/1/11
16 G5 1/4/15 1/3/14 1/4/16
11 G5 31/12/15 31/12/14 31/12/16
我试图找到药物在服用药物后一年内为一位独特患者开处方的次数,最终得到如下表格:
patient number drugtype date date - 1 year date + 1 year number of prescriptions within year
11 G5 1/1/15 1/1/14 1/1/16 3
16 G5 5/4/13 5/4/12 5/4/14 1
19 R6 2/1/12 2/1/11 2/1/13 2
11 G5 7/4/14 7/4/13 7/4/15 2
19 R6 4/6/11 4/6/10 4/6/12 2
16 G5 3/2/12 3/2/11 3/2/13 1
32 G5 2/4/14 2/4/13 2/4/15 1
11 G5 1/1/10 1/1/9 1/1/11 1
16 G5 1/4/15 1/3/14 1/4/16 1
11 G5 31/12/15 31/12/14 31/12/16 2
所以逻辑上我需要循环遍历numberofprescriptionswithinayear <- ifelse(patient number=x & drugtype=y & date > date-1year & date+1year, 1, 0)
和sum
的行。
是否有更容易的循环方式,因为我还需要添加其他变量,例如一年内G5的处方数量,以及一年内R6的处方数量。
我最初做错的处方数量的计算。如何计算是在实际日期一年左右给出了多少其他处方(介于加1和减1之间) - 对于任何不清楚感到抱歉。
答案 0 :(得分:1)
我无法发表评论,因为我没有得到足够的声誉。
使用包lubridate --> int_overlaps()
,您可以确定日期时间是否在两个其他日期时间的间隔内。这可能对你有帮助。
答案 1 :(得分:1)
我认为您的预期输出表中的值不正确。
您可以使用data.table
来实现结果,方法是将数据与自身相结合,然后执行简单的子集&amp;计算
library(data.table)
## data (with formatted headings & date types)
dt <- structure(list(patient_number = c(11L, 16L, 19L, 11L, 19L, 16L,
32L, 11L, 16L, 11L), drugtype = structure(c(1L, 1L, 2L, 1L, 2L,
1L, 1L, 1L, 1L, 1L), .Label = c("G5", "R6"), class = "factor"),
date = structure(c(16436, 15800, 15341, 16167, 15129, 15373,
16162, 14610, 16526, 16800), class = "Date"), previous_year = structure(c(16071,
15435, 14976, 15802, 14764, 15008, 15797, 14245, 16130, 16435
), class = "Date"), next_year = structure(c(16801, 16165,
15707, 16532, 15495, 15739, 16527, 14975, 16892, 17166), class = "Date")), .Names = c("patient_number",
"drugtype", "date", "previous_year", "next_year"), row.names = c(NA,
-10L), class = c("data.table", "data.frame"))
setDT(dt)
dt[ dt, on=c("patient_number", "drugtype"), allow.cartesian = T ## join it all together
][
previous_year <= i.date & i.date <= next_year ## filter results
][
, .(n_count = .N), by=.(patient_number, drugtype, date) ## do the calculation
]
# patient_number drugtype date n_count
# 1: 11 G5 2015-01-01 3
# 2: 11 G5 2014-04-07 2
# 3: 11 G5 2015-12-31 2
# 4: 16 G5 2013-04-05 1
# 5: 19 R6 2012-01-02 2
# 6: 19 R6 2011-06-04 2
# 7: 16 G5 2012-02-03 1
# 8: 32 G5 2014-04-02 1
# 9: 11 G5 2010-01-01 1
# 10: 16 G5 2015-04-01 1
另一种方法,但给出相同的结果
dt[ dt,
{
idx = i.previous_year <= date & date <= i.next_year
.(date = date[idx],
previous_year = previous_year[idx],
next_year = next_year[idx])
},
on=c("patient_number", "drugtype"),
by=.EACHI
][, .(n_count = .N), by=.(patient_number, drugtype, date)]