根据规则集删除重复的观察

时间:2013-03-22 17:48:15

标签: r duplicate-removal

我正在尝试根据我的变量id从数据集中删除重复的观察结果。但是,我希望删除观察结果基于以下规则。下面的变量是id,户主的性别(男性,男性,女性)和户主的年龄。规则如下。如果一个家庭有男性和女性家庭户主,则取消女性户主观察。如果一个家庭为两个男性或两个女性头部,请用年轻的家庭头部取消观察。下面是一个示例数据集。

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

2 个答案:

答案 0 :(得分:12)

您可以先命名data.frame,然后先为每个id添加所需的条目,然后删除重复id的行。

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

答案 1 :(得分:8)

使用data.table,“复合查询”很容易。要在阅读时订购数据,请在读取时将“密钥”设置为“id,sex”(如果任何女性值出现在给定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