我有一个得分数据集:
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)]),]
如何订购结果并删除得分最低的结果?
答案 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]),]