过滤 R data.frame 中的重复行

sac*_*inv 0 r filter dplyr data.table

我有一个 data.frame 如下所示。

> df2 <- data.frame("StudentId" = c(1,1,1,2,2,3,3), "Subject" = c("Maths", "Maths", "English","Maths", "English", "Science", "Science"), "Score" = c(100,90,80,70, 60,20,10))
> df2
  StudentId Subject Score
1         1   Maths   100
2         1   Maths    90
3         1 English    80
4         2   Maths    70
5         2 English    60
6         3 Science    20
7         3 Science    10
Run Code Online (Sandbox Code Playgroud)

很少有 StudentId 的主题列有重复值(例如:ID 1 有 2 个“数学”条目。我只需要保留第一个重复行。预期的 data.frame 是:

  StudentId Subject Score
1         1   Maths   100
3         1 English    80
4         2   Maths    70
5         2 English    60
6         3 Science    20
Run Code Online (Sandbox Code Playgroud)

我无法做到这一点。有任何想法吗。

akr*_*run 5

我们可以在转换为 'data.table' ( )后使用uniquefromdata.table和选项bysetDT(df2)

library(data.table)
unique(setDT(df2), by = c("StudentId", "Subject"))
#   StudentId Subject Score
#1:         1   Maths   100
#2:         1 English    80
#3:         2   Maths    70
#4:         2 English    60
#5:         3 Science    20
Run Code Online (Sandbox Code Playgroud)

或者distinct来自“df2”

library(dplyr)
distinct(df2, StudentId, Subject)
#     StudentId Subject Score
#       (dbl)  (fctr) (dbl)
#1         1   Maths   100
#2         1 English    80
#3         2   Maths    70
#4         2 English    60
#5         3 Science    20
Run Code Online (Sandbox Code Playgroud)

或duplicated来自base R

df2[!duplicated(df2[1:2]),]
Run Code Online (Sandbox Code Playgroud)

编辑:基于@David Arenburg 的建议)

  • 我认为只是`unique(setDT(df2), by = c("StudentId", "Subject"))`?或“不同(df2,StudentId,主题)”? (2认同)