使用dplyr / tidyverse删除基于多列的重复行?

use*_*745 3 r dplyr tidyverse

我想使用 dplyr / tidyverse 删除基于 >1 列的重复行

例子

library(dplyr)

df <- data.frame(a=c(1,1,1,2,2,2), b=c(1,2,1,2,1,2), stringsAsFactors = F)
Run Code Online (Sandbox Code Playgroud)

我认为这会返回第 3 行和第 6 行,但它返回 0 行。

df %>% filter(duplicated(a, b))
# [1] a b
# <0 rows> (or 0-length row.names)
Run Code Online (Sandbox Code Playgroud)

相反,我认为这会返回第 1、2、4 和 5 行,但它返回所有行。

df %>% filter(!duplicated(a, b))
#   a b
# 1 1 1
# 2 1 2
# 3 1 1
# 4 2 2
# 5 2 1
# 6 2 2
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

r2e*_*ans 7

duplicated期望对“向量或数据框或数组”进行操作(但不是两个向量……它仅在其第一个参数中查找重复项)。

df %>%
  filter(duplicated(.))
#   a b
# 1 1 1
# 2 2 2

df %>%
  filter(!duplicated(.))
#   a b
# 1 1 1
# 2 1 2
# 3 2 2
# 4 2 1
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢引用特定的列子集,请使用cbind

df %>%
  filter(duplicated(cbind(a, b)))
Run Code Online (Sandbox Code Playgroud)

作为旁注,这个dplyr动词可以是distinct

df %>%
  distinct(a, b, .keep_all = TRUE)
#   a b
# 1 1 1
# 2 1 2
# 3 2 2
# 4 2 1
Run Code Online (Sandbox Code Playgroud)

虽然我不知道它有这个函数的反函数。