2016-09-09 2 views
0

Ich habe ein Dataset mit vielen doppelten TIME- und AIR-Dateneinträgen. Ich muss alle Zeilen entfernen, die diese Einträge enthalten. Dies wäre an sich sehr einfach sein:Entfernen von Duplikaten nur aus bestimmten Spalten/Zeilen

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 ausgeben würde, die folgenden:

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

Ich brauche aber jeden Tag zu prüfen, oder DATE, einzeln, ich die Ausgabe der Suche bin eigentlich für ist :

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 

In diesem Fall ist die Vervielfältigung für jeden bestimmten Tag anhält. Ich dachte, es wäre so einfach wie leicht mein Stück Code anzupassen, es zeigt sich, dass es nicht ist, habe ich viele Variationen von: DF2 <- DF[!(duplicated(DF$TIME) & duplicated(DF$AIR)) & duplicated(DF$DATE),] vergeblich versucht. Es erfordert daher wahrscheinlich etwas etwas komplizierter - oder zumindest über meine derzeitigen Mittel hinaus. Könnte jemand darüber beraten, was ich tun müsste, um jeden Tag getrennt auf diese Weise zu betrachten? Ich danke dir sehr!

Beachten Sie, dass es in Wirklichkeit sein kann, dass TIME dupliziert ist, aber AIR nicht ist; Aus diesem Grund muss ich nur die Einträge entfernen, in denen TIME und AIR Duplikate sind.

+0

Wenn Sie keine anderen Spalten in Ihren Daten haben, können Sie 'einzigartig (DF) verwenden' –

+0

meine vollständige Datensatz hat leider über 104 Spalten – Visser

+0

In diesem Fall können Sie 'DF [! duplicated (DF [, 1: 3]),]' verwenden, wenn dies die ersten 3 Spalten sind. Alternativ können Sie einen Zeichenvektor für Spaltennamen angeben, um '1: 3' zu ersetzen. –

Antwort

1

Sie gruppieren müssen, also (mit dplyr)

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