2013-03-22 14 views
10

Sto tentando di rimuovere le osservazioni duplicate da un set di dati basato sulla mia variabile, id. Tuttavia, voglio che la rimozione delle osservazioni sia basata sulle seguenti regole. Le variabili sottostanti sono id, il sesso della testa della famiglia (1-maschio, 2-femmina) e l'età della testa della famiglia. Le regole sono le seguenti. Se una famiglia ha capi famiglia sia maschi che femmine, rimuovere l'osservazione della testa familiare. Se una famiglia ha due teste maschili o due femmine, rimuovi l'osservazione con la testa della famiglia più giovane. Un set di dati di esempio è sotto.Rimuovere le osservazioni duplicate basate sul set di regole

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)) 

risposta

12

È possibile farlo dal primo ordinando la data.frame in modo che la voce desiderata per ogni id è il primo, e quindi rimuovere le righe con duplicate 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

Stavo pensando più complicato. Semplice uso della logica +1 –

+0

ha avuto la stessa idea, ma non è venuto in mente '-age' (+1) – adibender

+0

' ID 10' sembra mancare dall'uscita però ... – adibender

8

Con data.table, questo è facile con "query composte". Per ordinare i dati quando lo leggi, imposta la "chiave" quando la leggi come "id, sex" (richiesta nel caso in cui i valori femminili vadano prima dei valori maschili per un dato 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 le tue 'data.table' Le risposte sono sempre all'occhiello –

+0

ho dovuto rimuovere la mia modifica poiché la mia soluzione era" mantenere il più giovane ". Leggi la domanda sbagliata. – Arun