【问题标题】:Remove duplicate observations based on set of rules根据一组规则删除重复的观察
【发布时间】:2013-03-12 16:32:45
【问题描述】:

我正在尝试根据我的变量 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))

【问题讨论】:

    标签: r duplicate-removal


    【解决方案1】:

    您可以通过首先订购data.frame 来做到这一点,因此每个id 的所需条目是第一个,然后删除具有重复ids 的行。

    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
    • 有同样的想法,但没有想出-age (+1)
    【解决方案2】:

    使用data.table,使用“复合查询”很容易。要在读入数据时对数据进行排序,请在读入数据时将“key”设置为“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
    

    【讨论】:

    • 不得不删除我的编辑,因为我的解决方案是“保留最年轻的”。读错问题。
    猜你喜欢
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多