我想使用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)
我原本认为这会返回第3行和第6行,但实际上它并没有返回任何行。
df %>% filter(duplicated(a, b))
# [1] a b
# <0 rows> (or 0-length row.names)
相反,我认为这将返回第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
我漏掉了什么?
cbind
方法在一些罕见的情况下会失败,比如df <- data.frame(a=c(11, 1), b=c(1,12), stringsAsFactors = F); df %>% filter(duplicated(cbind(a, b)))
,但它并没有失败。看起来是一个很好的解决方案。 - stevecdistinct
,因为这是最“本地”的整洁方法。很想知道是否有它的反向操作,只是为了学习和了解。 - stevecjanitor::get_dupes
? - Ian Campbelldata.frame(a=c("xy", "x"), b=c("x", "yx"))
)。因此,我认为distinct
是更好的选择。顺便说一句,恭喜你达到了10万个。 - steveccbind(a,b)
怎么会出错,因为“xy”和“x”(第1行)从未真正合并。也就是说,我认为你是在说“xyx”可能是模棱两可的;但这种错误不应该发生。它对你来说表现不正确吗?(别太早恭喜我,我还差6分;-) - r2evans