2016-03-18 51 views
0

我是R新手。我必須根據以下標準編寫一些代碼來清除潛在的重複實驗記錄。 我希望有人能給我一些幫助,如何在dplyr做到這一點?我知道R中有一個重複的函數,並且在lubridate包中還有一個日期函數,可以很容易地定義日期差異。使用3個條件識別重複項

的清理規則如下:

  1. 如果採集日期6個月內從最後採集日期和類型是「相同」,然後刪除與記錄後來的收集日期。

  2. 如果採集日期從最後採集日期個月內6和類型是「不同」,則保留兩個記錄。

  3. 如果採集日期6個月內,並一個記錄具有噬菌體型,另一種具有NA噬菌體型,然後用NA噬菌體型是6個月內即刪除該記錄。

我想創建一個名爲「標誌去除」新列標記應該被刪除,所以我們可以刪除這些記錄前檢查記錄。

這是一個數據集。有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 
+0

你能提供一些額外的信息嗎?例如:身份證是否有可能出現兩次以上?日期是否總是按每個ID遞增排序? – DatamineR

回答

-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表示要刪除的重複行。

+0

哇,這是超級有用!除了第14行(ID 281839)之外,大部分結果都是正確的,因爲記錄超出6個月(即使類型爲NA),我們應該保留記錄。所以,在查看你的代碼時,它看起來是正確的,所以我不確定爲什麼第14行被標記爲TRUE。你知道爲什麼以及如何解決這個問題嗎? 我還需要在星期一查看更多數據。您提出了一個非常好的觀點,因爲每個客戶端可能會有兩行以上的數據,這會使規則更加複雜。謝謝你的幫助。 – ayk

+0

該值被標記爲「TRUE」,因爲它滿足條件:在6個月內+一個值爲「NA」。 – DatamineR