2016-03-18 2 views
0

私はRを初めて使用しています。次の基準に基づいて潜在的な重複ラボ記録を削除するコードを書く必要があります。 誰かが私にdplyrでこれを行う方法について何か助けてくれることを願っていますか? Rに重複機能があり、日付の違いを簡単に定義できるようにするlubridateパッケージの日付機能もあります。3つの条件を使用して重複を特定する

次のようにクリーンアップルールは以下のとおりです。

  1. 収集日が最後の収集日から6ヶ月以内であり、タイプは「同じ」であれば、でレコードを削除後の収集日。

  2. 収集日が最後の収集日から6ヶ月以内にであり、タイプは「異なる」であれば、両方のレコードを保持します。収集日は6ヶ月以内がある場合

  3. 、および一つのレコードは、ファージタイプがあり、他方は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 
+0

追加情報がありますか?例:IDが2回以上現れる可能性はありますか?日付は常にIDごとに昇順に並べられていますか? – DatamineR

答えて

-1

あなたは(IDは、主に2回表示され、日付がascendingly順序付けられていることができることを仮定して)次のようなものを試みることができる:

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としてマークされているか分からない。あなたはそれをどうやって解決するのか知っていますか? また、月曜日にデータを確認する必要があります。ルールをさらに複雑にするクライアントごとに2行以上のデータが存在する可能性があるため、非常に良い点がありました。ご協力いただきありがとうございます。 – ayk

+0

値は3条件を満たしているため、「TRUE」とマークされます.6ヶ月以内+ 1つの値は「NA」です。 – DatamineR

関連する問題