2013-03-22 23 views
10

Değişkeme, id'ye bağlı olarak bir veri kümesinden yinelenen gözlemleri kaldırmaya çalışıyorum. Ancak, gözlemlerin kaldırılmasını aşağıdaki kurallara dayandırmak istiyorum. Aşağıdaki değişkenler id, hane reisinin cinsiyeti (1-erkek, 2-kadın) ve hane reisinin yaşıdır. Kurallar aşağıdaki gibidir. Bir hanenin hem erkek hem de kadın hane reisleri varsa, kadın hanehalkı gözlemini kaldırın. Bir hanenin iki erkek ya da iki dişi kafa şeklinde olması halinde, gözlemi daha genç ev hanesi ile çıkarın. Bir örnek veri seti aşağıdadır.Kurallar kümesine göre yinelenen gözlemleri kaldırın

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

cevap

12

Öyle her id için istenen girdi ilk ilk data.frame sipariş bunu ve sonra yinelenen id s ile satırları kaldırabilirsiniz. data.table ile

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

Daha karmaşık düşünüyorum. Mantığın basit kullanımı +1 –

+0

aynı fikre sahipti, ama '-age '(+1) – adibender

+0

' id 10' ile çıkmadı, çıktıdan eksik gibi görünüyor ... – adibender

8

, bu "bileşik sorgular" ile çok kolay. Okunduğunuzda verileri sipariş etmek için, "id" ("id") olarak okunduğunuzda "anahtar" ı (herhangi bir kadın değerinin belirli bir ID için erkek değerlerinden önce gelmesi durumunda gereklidir) ayarlayın.

> 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 'data.table' cevabınız her zaman göz açıp kapayıncaya kadar –

+0

benim düzenlememi kaldırmak zorunda kaldı benim çözümüm" en küçüğü tutmaktı ". Soruyu yanlış oku. – Arun

İlgili konular