我是R的新手。 我必须编写一些代码来根据以下标准清除潜在的重复实验室记录。我希望有人能给我一些关于如何在dplyr
做到这一点的帮助? 我知道 R 中有一个重复的函数,lubridate
包中还有一个日期函数,可以轻松定义日期差异。
清理规则如下:
- 如果收集日期
自上次收集日期起 6 个月内,并且类型为"相同",则删除收集日期较晚的记录。
如果收集日期在上次收集日期后的 6 个月内,并且类型"不同",则保留两个记录。
如果收集日期在 6 个月内,并且一条记录具有噬菌体类型,另一条记录具有 NA 噬菌体类型,则删除 6 个月内具有 NA 噬菌体类型的记录。
我想创建一个名为"删除标志"的新列来标记应删除的记录,以便我们可以在删除这些记录之前进行检查。
这是一个数据集。 有 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 大多可以出现两次,并且日期按升序排序):
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
指示要删除的重复行。