首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过分组测试一行中的值与之前所有行的值是否唯一,并统计不同值的个数

如何通过分组测试一行中的值与之前所有行的值是否唯一,并统计不同值的个数
EN

Stack Overflow用户
提问于 2019-01-18 22:16:52
回答 2查看 69关注 0票数 0

我正在尝试测试一行中的值是否与之前所有行的值按组进行比较是否唯一。

例如,对于ID=1,我希望将当前行的药物与ID=1下的所有前一行(或to DATE,与当前行之前的那些药物进行比较)进行比较,例如。在第2行,药物A与第1行相同,因此EXIST_BEFORE编码为1;对于第4行,C与之前的行(ABC)相比是唯一的,因此编码为0

添加另一个问题:如何统计当前date之前的不同drug的数量?例如,对于ID=1,第4行的prev_drug2,因为它在第4行的DATE之前有两种不同于药物C的药物(A,B)。

代码语言:javascript
复制
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比较之前的日期。

EN

回答 2

Stack Overflow用户

发布于 2019-01-18 22:25:22

为此,请尝试使用dplyr。基本上我们可以在IDDRUG上分组。对于分组的组合,使用min()查找第一个DATE匹配项。然后,如果日期在第一次出现之后,则它是重复的。

代码语言:javascript
复制
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()行简化为:

代码语言:javascript
复制
mutate(EXIST_BEFORE = DATE > min(DATE))
票数 1
EN

Stack Overflow用户

发布于 2019-01-18 23:20:32

或者,也可以使用data.table包中的rowid()函数:

代码语言:javascript
复制
library(data.table)
setDT(DT)[order(DATE), EXIST_BEFORE := pmin(1L, rowid(ID, DRUG) - 1L)]
DT

ID 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开始统计IDDRUG (一种隐含分组)的出现次数。pmin()用于截断大于1的值。order(DATE)确保对行进行适当的排序。

或者,如Sotos' comment中所建议的

代码语言:javascript
复制
setDT(DT)[order(DATE), EXIST_BEFORE := as.integer(duplicated(DRUG)), by = ID][]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54255838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档