2016-09-09 42 views
0

我有一個包含大量重複TIME和AIR數據項的數據集。我需要刪除所有包含這些條目的行。這本身是非常簡單的:只刪除特定列/行中的重複項

DATE <- c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3) 
    #Supposed to be 4 entries per date; day 1 has 1 entry too many, day 2 has 2 entries too many 
TIME <- c(0,3,3,6,9,0,0,3,6,9,9,0,3,6,9) 
    #Samples are taken every 3 hours from 0-9 each day 
AIR <- c(1.1, 1.2, 1.2, 1.3, 1.4, 1.1, 1.1, 1.2, 1.3, 1.4, 1.4, 1.1, 1.2, 1.3, 1.4) 

DF <- data.frame(DATE, TIME, AIR) 

DF1 <- DF[!(duplicated(DF$TIME) & duplicated(DF$AIR)),] 

DF1將輸出如下:

DATE TIME AIR 
1 1 0 1.1 
2 1 3 1.2 
4 1 6 1.3 
5 1 9 1.4 

不過,我需要考慮的每一天,或日期,單獨,我實際上是尋找輸出:

DATE TIME AIR 
1 0 1.1 
1 3 1.2 
1 6 1.3 
1 9 1.4 
2 0 1.1 
2 3 1.2 
2 6 1.3 
2 9 1.4 
3 0 1.1 
3 3 1.2 
3 6 1.3 
3 9 1.4 

在這種情況下,複製會在每一天停止。我認爲這會稍微適應我的代碼片段,但事實並非如此,我嘗試了很多變體:DF2 <- DF[!(duplicated(DF$TIME) & duplicated(DF$AIR)) & duplicated(DF$DATE),]無濟於事。因此,它可能需要稍微複雜一些 - 或者至少超出我目前的手段。任何人都可以建議我需要怎麼做才能以這種方式分別考慮每一天?非常感謝!

請注意,實際上它可能是TIME是重複的,但AIR不是;這就是爲什麼我必須刪除那些TIMEAIR重複的條目。

+0

如果你沒有在你的數據的任何其他列,您可以用'獨特(DF)' –

+0

不幸的是我的全部數據集有大約104列 – Visser

+0

在這種情況下,如果這些是前3列,則可以使用DF [!duplicated(DF [,1:3])]。或者,您可以指定列名的字符向量來替換「1:3」。 –

回答

1

您需要組,即(有dplyr

library(dplyr) 
DF %>% 
    group_by(DATE) %>% 
    filter(!(duplicated(TIME) & duplicated(AIR))