2013-03-22 14 views
10

私の変数idに基づいてデータセットから重複した観測を削除しようとしています。しかし、以下のルールに基づいて観測を削除したい。以下の変数は、id、世帯主の性別(1-男性、2-女性)および世帯主の年齢である。ルールは次のとおりです。世帯に男性と女性の両方の家庭の頭がある場合は、女性の世帯頭の観察を取り除いてください。家系が2頭の男性または2頭の女性の場合は、若い世帯の頭部で観察を取り除いてください。データセットの例を以下に示します。ルールセットに基づいて重複した観測を削除する

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

答えて

12

あなたはまずので、各idのために所望のエントリが最初で、その後、重複id秒で行を削除data.frameを注文することによってこれを行うことができます。

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

私はもっと複雑に思っていました。単純なロジックの使用+1 –

+0

は同じアイデアを持っていましたが、 '-age'(+1) – adibender

+0

' id 10'が出力から抜けているようです... – adibender

8

data.tableでは、これは "複合クエリ"で簡単です。読み込み時にデータを注文するには、「ID、性別」として読み込むときに「キー」を設定します(ある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あなたの 'data.table'答えは常に私の解決策が"最年少を保つ "ために –

+0

私の編集を削除する必要がありました。間違った質問を読む。 – Arun

関連する問題