2017-04-19 32 views
0

我有一個包含重複記錄的數據集,可以由組確定。我想在最早的記錄之後(按日期)將任何東西標記爲重複(或者如果日期相同,則爲第一行.id)。在R中使用data.table選擇重複組的最近行數

library(data.table) 
library(lubridate) 

groupA <- c("A","B","C","A","B","C","D","E","A") 
groupB <- c("y","n","n","y","y","n","y","n","y") 
#ymd format 
date <- c("2017-04-01","2017-02-01","2017-03-01","2017-01-01","2017-05-01","2017-03-01","2017-07-01","2017-08-01","2017-09-01") 

mydata <- data.table(groupA, groupB, date=ymd(date)) 
check.dups <- mydata[,.("count"=.N),by=.(groupA,groupB)] 
#These are the duplicate keys 
check.dups <- check.dups[count>1,] 

#Create dupliate.flag on most recent example for duplicates 
keycols <- c("groupA","groupB") 
setkeyv(mydata, keycols) 
setkeyv(check.dups, keycols) 

我堅持對選擇行邏輯創造重複標誌的最早日期/第一row.id後。

#Select rows for duplicate flag 
mydata[check.dups,][date > min(date),dup.flag := ] 

任何幫助非常感謝。

預期輸出:

一個標誌由於日期,C標記因爲row.id的(日期相同)

groupA groupB date  dup.flag 
A  y  2017-04-01 y 
B  n  2017-02-01 NA 
C  n  2017-03-01 NA 
A  y  2017-01-01 NA 
B  y  2017-05-01 NA 
C  n  2017-03-01 y 
D  y  2017-07-01 NA 
E  n  2017-08-01 NA 
A  y  2017-09-01 y 
+0

'mydata [,(date!= min(date)),by =。(groupA,groupB)]'可用於標記。但是,您希望如何處理與「分鐘(日期)」相同的分鐘? –

+0

您能澄清您的預期輸出嗎? –

回答

2

請,嘗試從data.tableduplicated()功能:

setkey(mydata, groupA, groupB, date) 
mydata[, dup := duplicated(mydata, by = c("groupA", "groupB"))] 

mydata 
# groupA groupB  date dup 
#1:  A  y 2017-01-01 FALSE 
#2:  A  y 2017-04-01 TRUE 
#3:  A  y 2017-09-01 TRUE 
#4:  B  n 2017-02-01 FALSE 
#5:  B  y 2017-05-01 FALSE 
#6:  C  n 2017-03-01 FALSE 
#7:  C  n 2017-03-01 TRUE 
#8:  D  y 2017-07-01 FALSE 
#9:  E  n 2017-08-01 FALSE 
+0

,很好地工作。謝謝。 – iboboboru