我想使用 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)
我错过了什么?
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)
虽然我不知道它有这个函数的反函数。