根据条件从数据集中删除重复项

时间:2016-02-06 16:29:27

标签: r

我有一个得分数据集:

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

如何订购结果并删除得分最低的结果?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

有很多方法可以获得预期的输出。 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分组每个组合的第一行('.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]),]