2013-03-22 14 views
10

Próbuję usunąć duplikaty obserwacji z zestawu danych na podstawie mojej zmiennej, id. Chcę jednak, aby usunięcie obserwacji opierało się na następujących zasadach. Poniższe zmienne to id, płeć głowy gospodarstwa domowego (1-męski, 2-żeński) i wiek głowy rodziny. Zasady są następujące. Jeśli gospodarstwo domowe ma zarówno męskie, jak i żeńskie głowy, usuń obserwację kobiecej głowy. Jeśli gospodarstwo domowe składa się z dwóch mężczyzn lub dwóch kobiet, usuń obserwację młodszą głową rodziny. Przykładowy zestaw danych znajduje się poniżej.Usuwanie powielonych obserwacji w oparciu o zestaw reguł

id = c(1,2,2,3,4,5,5,6,7,8,8,9,10) 
sex = c(1,1,2,1,2,2,2,1,1,1,1,2,1) 
age = c(32,34,54,23,32,56,67,45,51,43,35,80,45) 
data = data.frame(cbind(id,sex,age)) 

Odpowiedz

12

Można to zrobić przez pierwszy zamawiania data.frame tak pożądana pozycja dla każdego id jest pierwszy, a następnie usunąć wiersze z zduplikowanych id s.

d <- with(data, data[order(id, sex, -age),]) 
# id sex age 
# 1 1 1 32 
# 2 2 1 34 
# 3 2 2 54 
# 4 3 1 23 
# 5 4 2 32 
# 7 5 2 67 
# 6 5 2 56 
# 8 6 1 45 
# 9 7 1 51 
# 10 8 1 43 
# 11 8 1 35 
# 12 9 2 80 
# 13 10 1 45 
d[!duplicated(d$id), ] 
# id sex age 
# 1 1 1 32 
# 2 2 1 34 
# 4 3 1 23 
# 5 4 2 32 
# 7 5 2 67 
# 8 6 1 45 
# 9 7 1 51 
# 10 8 1 43 
# 12 9 2 80 
# 13 10 1 45 
+0

Myślałem, że jest bardziej skomplikowana. Proste użycie logiki +1 –

+0

miało ten sam pomysł, ale nie wymyśliło '-age' (+1) – adibender

+0

" id 10 "wydaje się brakować na wyjściu chociaż ... – adibender

8

Dzięki "data.table" jest to łatwe dzięki "zapytaniom złożonym". Aby zamówić dane po ich przeczytaniu, ustaw "klucz", gdy czytasz go jako "id, sex" (wymagany, jeśli wartości żeńskie pojawią się przed wartościami męskimi dla danego ID).

> library(data.table) 
> DT <- data.table(data, key = "id,sex") 
> DT[, max(age), by = key(DT)][!duplicated(id)] 
    id sex V1 
1: 1 1 32 
2: 2 1 34 
3: 3 1 23 
4: 4 2 32 
5: 5 2 67 
6: 6 1 45 
7: 7 1 51 
8: 8 1 43 
9: 9 2 80 
10: 10 1 45 
+0

+1 twoje 'data.table' Odpowiedzi zawsze otwierają oczy –

+0

musiałem usunąć moją edycję, ponieważ moim rozwiązaniem było" zatrzymać najmłodszych ". Przeczytaj błędne pytanie. – Arun

Powiązane problemy