【问题标题】:Identify duplicates using 3 conditions使用 3 个条件识别重复项
【发布时间】:2016-03-21 20:22:30
【问题描述】:

我是 R 新手。我必须根据以下标准编写一些代码来清除潜在的重复实验室记录。 我希望有人可以在dplyr 中帮助我如何做到这一点?我知道 R 中有一个重复函数,lubridate 包中还有一个日期函数,可以轻松定义日期差异。

清理规则如下:

  1. 如果收款日期距离上次收款日期6个月内且类型为“相同”,则删除收款日期较晚的记录.

  2. 如果收集日期与上次收集日期在 6 个月内且类型为“不同”,则保留这两个记录。

  3. 如果收集日期在 6 个月内,并且一个记录是噬菌体类型,另一个记录是 NA 噬菌体类型,则删除记录6 个月内的 NA 噬菌体类型。

我想创建一个名为“删除标记​​strong>”的新列来标记应删除的记录,以便我们在删除这些记录之前进行检查。

这是一个数据集。有 5 个客户有重复记录,我已经在数据集之后包含了预期的结果。

dat0<-read.table(text="
ID  Collection_Date Type
9318    5/8/2014    SE_8
29210   2/9/2015    SE_19
31733   10/27/2014  SE_13a
31733   10/29/2014  SE_13a
35463   4/14/2015   SE_13
260717  1/7/2016    SE_8
267125  7/15/2014   SE_8
276105  12/11/2014  SE_13a
276105  1/25/2015   NA
276195  11/20/2015  SE_13a
280415  9/21/2014   SE_8
280957  4/28/2015   SE_22
281839  1/6/2016    SE_13a
281839  11/21/2016  NA
302594  8/30/2015   SE_13a
423090  1/2/2016    SE_13
434579  1/10/2015   SE_13a
438046  4/15/2015   SE_22
438046  5/19/2015   SE_8
438396  1/14/2016   SE_13a
453374  2/19/2014   SE_35
519832  1/4/2015    SE_8
520665  8/15/2014   SE_13
520665  10/9/2014   SE_13
",sep="",header=TRUE)

5 个重复客户的预期结果:

31733   27-Oct-2014 SE_13a  Keep 
31733   29-Oct-2014 SE_13a  Delete # because  the record is within 6 months and type is the same
#-------------------
276105  11-Dec-2014 SE_13a  Keep
276105  25-Jan-2015 NA      Delete # because type is missing and record is within 6 months of the record above
#-------------------
281839  06-Jan-2016 SE_13a  Keep
281839  21-Nov-2016 NA      Keep # because dates are more than 6 months
#-------------------
438046  15-Apr-2015 SE_22   Keep
438046  19-May-2015 SE_8    Keep # because type is different even if date is within 6 months
#-------------------
520665  15-Aug-2014 SE_13   Keep
520665  09-Oct-2014 SE_13   Delete

【问题讨论】:

  • 你能提供一些额外的信息吗?例如:一个 ID 是否有可能出现两次以上?每个 ID 的日期是否总是按升序排列?

标签: r duplicates


【解决方案1】:

您可以尝试以下方法(假设一个 ID 最多可以出现两次,并且日期按升序排列):

dat0$Collection_Date <- as.Date(dat0$Collection_Date, "%m/%d/%Y")
library(zoo)
library(dplyr)

dat0 %>% group_by(ID) %>% 
    mutate((as.numeric(as.yearmon(Collection_Date)) 
            - lag(as.numeric(as.yearmon(Collection_Date))))*12 <= 6 
           & (lag(Type) == Type) | is.na(Type))

       ID Collection_Date   Type (as.numeric(as.yearmon(Collection_Dat...
    (int)          (date) (fctr)                                    (lgl)
1    9318      2014-05-08   SE_8                                       NA
2   29210      2015-02-09  SE_19                                       NA
3   31733      2014-10-27 SE_13a                                       NA
4   31733      2014-10-29 SE_13a                                     TRUE
5   35463      2015-04-14  SE_13                                       NA
6  260717      2016-01-07   SE_8                                       NA
7  267125      2014-07-15   SE_8                                       NA
8  276105      2014-12-11 SE_13a                                       NA
9  276105      2015-01-25     NA                                     TRUE
10 276195      2015-11-20 SE_13a                                       NA
11 280415      2014-09-21   SE_8                                       NA
12 280957      2015-04-28  SE_22                                       NA
13 281839      2016-01-06 SE_13a                                       NA
14 281839      2016-11-21     NA                                     TRUE
15 302594      2015-08-30 SE_13a                                       NA
16 423090      2016-01-02  SE_13                                       NA
17 434579      2015-01-10 SE_13a                                       NA
18 438046      2015-04-15  SE_22                                       NA
19 438046      2015-05-19   SE_8                                    FALSE
20 438396      2016-01-14 SE_13a                                       NA
21 453374      2014-02-19  SE_35                                       NA
22 519832      2015-01-04   SE_8                                       NA
23 520665      2014-08-15  SE_13                                       NA
24 520665      2014-10-09  SE_13                                     TRUE

TRUE 表示要删除的重复行。

【讨论】:

  • 哇,这个超级有用!!!大多数结果都是正确的,除了第 14 行(ID 281839),我们应该保留记录,因为记录超出 6 个月(即使类型为 NA)。因此,在查看您的代码时,它似乎是正确的,所以我不确定为什么第 14 行被标记为 TRUE。你知道为什么以及如何解决这个问题吗?我还需要在星期一更多地检查数据。您提出了一个很好的观点,因为每个客户端可能有两行以上的数据,这将使规则更加复杂。感谢您的所有帮助。
  • 该值被标记为TRUE,因为它满足3.条件:6个月内+一个值为NA
猜你喜欢
  • 2021-09-01
  • 1970-01-01
  • 2017-04-10
  • 2018-07-04
  • 2021-12-20
  • 2021-01-03
  • 2021-10-16
  • 2020-04-06
  • 1970-01-01
相关资源
最近更新 更多