【问题标题】:Remove duplicates from dataset based on criteria [duplicate]根据标准从数据集中删除重复项 [重复]
【发布时间】:2016-05-16 13:35:27
【问题描述】:

我有一个分数数据集:

    ID      Sub     Score
    1       Mat     45
    2       Mat     34
    3       Mat     67
    1       Mat     43
    2       Mat     34
    4       Mat     22
    5       Sci     78
    6       Mat     32
    1       Mat     56
    1       Sci     40

我只想输出每个科目中每个 ID 的最高分。例如,新列表应显示:

    ID      Sub     Score
    2       Mat     34
    3       Mat     67
    4       Mat     22
    5       Sci     78
    6       Mat     32
    1       Mat     56
    1       Sci     40

我可以通过以下方式找到重复的结果:

results[duplicated(results[, c(1,2)]),]

如何对结果排序并删除得分最低的?

【问题讨论】:

    标签: r


    【解决方案1】:

    有很多方法可以获得预期的输出。 dplyr 的一种选择是按“ID”、“子”列分组,使用top_n 获得最高分数观察,如果有重复行,请使用distinct

    library(dplyr)
    df1 %>% 
      group_by(ID, Sub) %>%
      top_n(1) %>% 
      distinct()
      ID   Sub Score
    #   (int) (chr) (int)
    #1     2   Mat    34
    #2     3   Mat    67
    #3     4   Mat    22
    #4     5   Sci    78
    #5     6   Mat    32
    #6     1   Mat    56
    #7     1   Sci    40
    

    或者使用data.table,我们将'data.frame'转换为'data.table'(setDT(df1)),按'ID'、'Sub'分组,我们order'Score'在降序和子集每个组组合的第一行(可以使用.SD[1L]head(.SD, 1))。

    library(data.table) 
    setDT(df1)[order(-Score), .SD[1L] ,.(ID, Sub)]
    

    或者另一个选项是 unique 在我们 order 之后的列,这样它只会为每个重复项选择第一个观察值。

    unique(setDT(df1)[order(ID, Sub,-Score)], by = c('ID', 'Sub'))
    

    或者使用base R,我们order 列,并使用duplicated 删除与前两列重复的行。

    df2 <- df1[with(df1, order(ID, Sub, -Score)),]
    df2[!duplicated(df2[1:2]),]
    

    【讨论】:

    • 嗯。我想知道 .SD[1L]unique 是否更快,因为 .SD[1L] 最近优化了 IIRC
    • @MichaelChirico 在最近的基准测试here 中,我发现.SD 非常慢(但我使用1.9.6 做到了这一点。它可能在开发版本中完全改变了)。据我所知,unique 很快。开发版本最好有一些基准。
    • 是的,这是最近才完成的,Arun 最近在 GForce 优化方面做了很多工作;我认为this 是让我认为.SD[1L] 可能具有竞争力的提交
    【解决方案2】:

    aggregate

    aggregate(Score ~ ID + Sub, df, max)
    
    #ID Sub Score
    #1  1 Mat    56
    #2  2 Mat    34
    #3  3 Mat    67
    #4  4 Mat    22
    #5  6 Mat    32
    #6  1 Sci    40
    #7  5 Sci    78
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多