如何按列删除重复行

12
df <- data.frame(id = c(1, 1, 1, 2, 2),
                 gender = c("Female", "Female", "Male", "Female", "Male"),
                 variant = c("a", "b", "c", "d", "e"))
> df
  id gender variant
1  1 Female       a
2  1 Female       b
3  1   Male       c
4  2 Female       d
5  2   Male       e
我想根据数据集中的gender列删除数据框中的重复行。我知道有类似的问题被提出(在这里),但这里的不同之处在于,我希望删除数据集的每个子集中的重复行,其中每个子集由一个唯一的id定义。
我的期望结果是这样的:
  id gender variant
1  1 Female       a
3  1   Male       c
4  2 Female       d
5  2   Male       e

我已经尝试过以下方法并且它能够工作,但我想知道是否有更加简洁、高效的方法?

out = list()
for(i in 1:2){
  df2 <- subset(df, id == i)
  out[[i]] <- df2[!duplicated(df2$gender), ]
}
do.call(rbind.data.frame, out)

2个回答

27
df[!duplicated(df[ , c("id","gender")]),]

#     id  gender  variant
#  1   1  Female     a
#  3   1   Male      c
#  4   2  Female     d
#  5   2   Male      e

使用 subset 的另一种方法如下:

subset(df, !duplicated(subset(df, select=c(id, gender))))

#   id  gender variant
# 1  1  Female     a
# 3  1    Male     c
# 4  2  Female     d
# 5  2    Male     e

4

如果您感兴趣,这里有一个基于dplyr的解决方案(已编辑以包括Gregor的建议)

library(dplyr)
group_by(df, id, gender) %>% slice(1)

#> # A tibble: 4 x 3
#> # Groups:   id, gender [4]
#>      id gender variant
#>   <dbl> <fctr>  <fctr>
#> 1     1 Female       a
#> 2     1   Male       c
#> 3     2 Female       d
#> 4     2   Male       e

根据需要删除哪些variant值,可能也值得使用arrange函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接