我正在尝试测试一行中的值是否与之前所有行的值按组进行比较是否唯一。
例如,对于ID=1,我希望将当前行的药物与ID=1下的所有前一行(或to DATE,与当前行之前的那些药物进行比较)进行比较,例如。在第2行,药物A与第1行相同,因此EXIST_BEFORE编码为1;对于第4行,C与之前的行(A,B,C)相比是唯一的,因此编码为0。
添加另一个问题:如何统计当前date之前的不同drug的数量?例如,对于ID=1,第4行的prev_drug是2,因为它在第4行的DATE之前有两种不同于药物C的药物(A,B)。
ID DATE DRUG EXIST_BEFORE prev_drug
1 2001-01-01 A NA 0
1 2001-02-01 A 1 0
1 2001-03-15 B 0 1
1 2001-04-20 C 0 2
1 2001-05-29 A 1 2
1 2001-05-02 B 1 2
2 2001-03-02 A NA 0
2 2001-03-23 C 0 1
2 2001-04-04 D 0 2
2 2001-05-05 B 0 3我只知道如何通过lag()与上面的一行进行比较,但不知道如何为每个ID比较之前的日期。
发布于 2019-01-18 22:25:22
为此,请尝试使用dplyr。基本上我们可以在ID和DRUG上分组。对于分组的组合,使用min()查找第一个DATE匹配项。然后,如果日期在第一次出现之后,则它是重复的。
library(dplyr)
mydata %>%
group_by(ID, DRUG) %>%
mutate(FIRST_OCCURANCE = min(DATE),
EXIST_BEFORE = DATE > FIRST_OCCURANCE)
ID DATE DRUG EXIST_BEFORE FIRST_OCCURANCE
<int> <date> <chr> <lgl> <date>
1 1 2001-01-01 A FALSE 2001-01-01
2 1 2001-02-01 A TRUE 2001-01-01
3 1 2001-03-15 B FALSE 2001-03-15
4 1 2001-04-20 C FALSE 2001-04-20
5 1 2001-05-29 A TRUE 2001-01-01
6 1 2001-05-02 B TRUE 2001-03-15
7 2 2001-03-02 A FALSE 2001-03-02
8 2 2001-03-23 C FALSE 2001-03-23
9 2 2001-04-04 D FALSE 2001-04-04
10 2 2001-05-05 B FALSE 2001-05-05我将它分为两个变量来显示正在发生的事情,但您也可以将mutate()行简化为:
mutate(EXIST_BEFORE = DATE > min(DATE))发布于 2019-01-18 23:20:32
或者,也可以使用data.table包中的rowid()函数:
library(data.table)
setDT(DT)[order(DATE), EXIST_BEFORE := pmin(1L, rowid(ID, DRUG) - 1L)]
DTID DATE DRUG EXIST\_BEFORE 1: 1 2001-01-01 A 0 2: 1 2001-02-01 A 1 3: 1 2001-03-15 B 0 4: 1 2001-04-20 C 0 5: 1 2001-05-29 A 1 6: 1 2001-05-02 B 1 7: 2 2001-03-02 A 0 8: 2 2001-03-23 C 0 9: 2 2001-04-04 D 0 10: 2 2001-05-05 B 0
rowid(ID, DRUG) - 1L从0开始统计ID和DRUG (一种隐含分组)的出现次数。pmin()用于截断大于1的值。order(DATE)确保对行进行适当的排序。
或者,如Sotos' comment中所建议的
setDT(DT)[order(DATE), EXIST_BEFORE := as.integer(duplicated(DRUG)), by = ID][]https://stackoverflow.com/questions/54255838
复制相似问题