【问题标题】:Remove all duplicates except last instance删除除最后一个实例之外的所有重复项
【发布时间】:2013-03-16 12:50:20
【问题描述】:

所以我在 R 中有一个数据集,以以下布局为例:

ID Date Tally
1 2/1/2011 1
2 2/1/2011 2
3 2/1/2011 3
1 2/1/2011 4
2 2/1/2011 5
1 2/1/2011 6
3 2/1/2011 7
4 2/1/2011 8
2 2/1/2011 9

我想删除除帖子 ID 的最后一个实例之外的所有实例。现在我可以在网上找到所有东西,我正在使用的功能正在删除除第一个实例之外的所有内容。

所以我的新数据框看起来像:

ID Date Tally
1 2/1/2011 6
3 2/1/2011 7
4 2/1/2011 8
2 2/1/2011 9

我该怎么做?现在我只能保留第一个实例。我希望它做相反的事情?有什么帮助吗?

【问题讨论】:

    标签: r duplicates


    【解决方案1】:

    这不只是将“fromLast”参数用于duplicated 的标准情况吗?

     dat[ !duplicated(dat[, c("ID", "Date")], fromLast=T),]
    #---------
      ID     Date Tally
    6  1 2/1/2011     6
    7  3 2/1/2011     7
    8  4 2/1/2011     8
    9  2 2/1/2011     9
    

    您的示例不够丰富,无法判断您是否需要重复测试中的“日期”列,因此也许您可以简化。我把它留在里面是为了说明duplicated 有一个 data.frame 方法。我更喜欢!duplicated 而不是unique,因为如果您要比较组,它可以轻松访问集合的补码。

    【讨论】:

    • (+1) 确实。 :-) 但是,我对duplicated.data.frame 有疑问,因为代码基本上是duplicated(do.call("paste", c(x, sep = "\r")), fromLast = fromLast),正如帮助页面指出的那样,“如果数据框包含带有嵌入式回车符或列的字符,则可能不完美不能可靠地映射到字符”。
    【解决方案2】:

    使用!rev(duplicated(rev(ID))) 过滤除最后唯一出现的所有事件。

    要过滤数据集,请使用dataset[!rev(duplicated(rev(dataset$ID))),]

    【讨论】:

    • 如果要保留前五个并删除其余重复项怎么办?
    【解决方案3】:

    使用data.table连接,可以设置mult = 'last'

    例如

    library(data.table)
    DT <- data.table(DF, key = 'id')
    
    # join with the unique ID values
    DT[unique(DT[,list(ID)]), mult= 'last']
    
       ID     Date Tally
    1:  1 2/1/2011     6
    2:  2 2/1/2011     9
    3:  3 2/1/2011     7
    4:  4 2/1/2011     8
    

    如果您知道唯一 ID,您还可以进行以下任何操作

    DT[.(1:4), mult='last']
    DT[list(1:4), mult = 'last']
    

    【讨论】:

      【解决方案4】:

      使用 dplyr:

      data <- data %>%
        group_by(ID) %>%
        slice(which.max(Tally))
      

      【讨论】:

        猜你喜欢
        • 2021-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-03
        • 1970-01-01
        • 2012-02-24
        • 2021-11-26
        相关资源
        最近更新 更多