2016-09-09 2 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, индивидуально, выход я на самом деле ищу это :

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 не является; поэтому я должен удалить только те записи, где TIME и AIR являются дубликатами.

+0

Если у вас нет никаких других столбцов в ваших данных, вы можете использовать 'уникальный (DF)' –

+0

К сожалению, мой полный набор данных имеет около 104 столбцы – Visser

+0

В этом случае вы можете использовать 'DF [! duplicated (DF [, 1: 3]),]', если это были первые 3 столбца. Кроме того, вы можете указать вектор символов имен столбцов, чтобы заменить «1: 3». –

ответ

1

Вам нужно сгруппировать, то есть (с dplyr)

library(dplyr) 
DF %>% 
    group_by(DATE) %>% 
    filter(!(duplicated(TIME) & duplicated(AIR)) 
Смежные вопросы