2013-03-22 56 views
10

我想從基於我的變量,ID的數據集中刪除重複的觀察值。但是,我想根據以下規則刪除觀察結果。下面的變量是id,戶主的性別(1男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

您可以先訂購data.frame這樣做,所以每個id所需的條目是第一,然後刪除重複的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

我想的比較複雜。簡單使用邏輯+1 – 2013-03-22 18:05:54

+0

有相同的想法,但沒有拿出'-age'(+1) – adibender 2013-03-22 18:07:47

+0

'id 10'似乎從輸出中丟失,儘管... – adibender 2013-03-22 18:11:04

8

對於data.table,使用「複合查詢」很容易。在閱讀數據時要訂購數據,當您將其讀作「身份證,性別」時(如果任何女性值會出現在給定身份證的男性值之前),請設置「密鑰」。

> 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'答案總是開眼 – 2013-03-22 18:40:04

+0

不得不刪除我的編輯,因爲我的解決方案是「保持最年輕」。閱讀錯誤的問題。 – Arun 2013-03-24 00:45:38