【发布时间】:2015-12-12 17:00:35
【问题描述】:
我有一个处方记录数据集。每行是特定日期的单一药物处方。我将药物分为部分重叠的两组。我想确定两个药物组在 3 天内开具处方的位置,但不包括从第 1 组和第 2 组开具相同药物的位置,以确定这对药物的后一种药物的日期。
我的数据示例:
library(data.table)
set.seed(10)
DT <- data.table(day = sample(c(1:31), 30, replace = TRUE),
drug_group = sample(c(1, 2), 30, replace = TRUE),
drug_1 = sample(c("A", "B", "C"), 30, replace = TRUE),
drug_2 = sample(c("A", "D", "E"), 30, replace = TRUE))
DT[drug_group == 1, drug := drug_1]
DT[drug_group == 2, drug := drug_2]
DT[, c("drug_1", "drug_2") := NULL]
setkey(DT, day)
所以如下:
day drug_group drug
1: 2 1 B
2: 3 1 C
3: 4 1 B
4: 7 2 E
5: 8 1 A
6: 9 2 A
7: 9 2 D
8: 9 1 C
9: 10 1 A
10: 12 1 A
...
24: 22 2 D
25: 22 2 E
26: 24 1 A
27: 25 1 A
28: 26 2 D
29: 26 1 C
30: 27 1 C
我想得到这样的结果:
day interaction_present
1: 1 FALSE
2: 2 FALSE
3: 3 FALSE
4: 4 FALSE
5: 5 FALSE
6: 6 FALSE
...
26: 26 TRUE
29: 29 FALSE
30: 30 FALSE
我很确定我可以通过依次循环遍历每一行来做到这一点,但我被反复告诫使用循环而不是矢量化,我想知道这种类型的任务在没有循环的情况下是否可行?我已经研究过使用 data.table shift() 函数来设置滞后,但我担心创建太多新列,因为我的实际 data.table 超过一百万行。
对不起,如果这是一个微不足道的问题,或者之前有人问过,但我整个下午都被困在这个问题上,我要放弃这一天!
【问题讨论】:
-
请使用
set.seed使示例可重现。 -
糟糕,好的,下次记得。
-
@iProcrastinate 只是用
set.seed重新运行您的代码,就像 akrun 要求的那样,复制并粘贴您的结果,以便我们检查是否正确 -
另外,对于第 2 天,药物 C、A、D 不是在 3 天内彼此相隔,而且来自 2 个不同的组?不应该是真的吗?同样,第 1 天?还是我们只查看前 3 天
-
我需要确定是否满足条件以及每对行计数一次的次数。
标签: r data.table