查找所有重复行,包括"具有较小下标的元素"

Lau*_*els 98 r duplicates r-faq

R' duplicated返回一个向量,显示向量或数据帧的每个元素是否是具有较小下标的元素的副本.因此,如果5行数据帧的第3行,第4行和第5行相同,duplicated则会给出向量

FALSE, FALSE, FALSE, TRUE, TRUE
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我真的想得到

FALSE, FALSE, TRUE, TRUE, TRUE
Run Code Online (Sandbox Code Playgroud)

也就是说,我想知道一行是否与具有更大下标的行重复.

Jos*_*ich 114

duplicated有一个fromLast论点."示例"部分?duplicated向您展示了如何使用它.只需调用duplicated两次,一次调用一次,fromLast=FALSE然后调用fromLast=TRUE其中任意一行TRUE.


一些晚期编辑:你没有提供一个可重复的例子,所以这里是@jbaums友好贡献的插图

vec <- c("a", "b", "c","c","c") 
vec[duplicated(vec) | duplicated(vec, fromLast=TRUE)]
## [1] "c" "c" "c"
Run Code Online (Sandbox Code Playgroud)

  • 等等,我刚试了一个测试,发现我错了:`x < - c(1:9,7:10,5:22); y < - c(字母,字母[1:5]); test < - data.frame(x,y); 测试[重复(测试$ x)| 重复(测试$ x,fromLast = TRUE),]`返回7,8和9的所有三个副本.为什么这样做? (3认同)
  • 因为无论从最后开始还是从前面开始,中间的都会被捕获。例如,`duplicated(c(1,1,1))` 与 `duplicated(c(1,1,1,), fromLast = TRUE)` 给出 `c(FALSE,TRUE,TRUE)` 和 `c(对,对,错)`。在这两种情况下,中间值为“TRUE”。取两个向量的“|”得到“c(TRUE,TRUE,TRUE)”。 (2认同)

42-*_*42- 33

您需要组合一组duplicated值,应用unique,然后进行测试%in%.与往常一样,样本问题将使这个过程变得活跃起来.

> vec <- c("a", "b", "c","c","c")
> vec[ duplicated(vec)]
[1] "c" "c"
> unique(vec[ duplicated(vec)])
[1] "c"
>  vec %in% unique(vec[ duplicated(vec)]) 
[1] FALSE FALSE  TRUE  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)


Hol*_*ndl 15

在数据帧重复的行可以用获得dplyr通过做

library(tidyverse)
df = bind_rows(iris, head(iris, 20)) # build some test data
df %>% group_by_all() %>% filter(n()>1) %>% ungroup()
Run Code Online (Sandbox Code Playgroud)

group_by_at(vars(-var1, -var2))可以使用排除某些列来对数据进行分组。

如果实际需要行索引而不仅仅是数据,您可以先添加它们,如下所示:

df %>% add_rownames %>% group_by_at(vars(-rowname)) %>% filter(n()>1) %>% pull(rowname)
Run Code Online (Sandbox Code Playgroud)

  • 很好地使用了“n()”。不要忘记取消对结果数据框的分组。 (2认同)
  • `group_by_all()` 和 `group_by_at()` 已在最新版本的 dplyr 中被取代。现在你可以这样做: `iris %&gt;% group_by(across()) %&gt;% filter(n() &gt; 1) %&gt;% ungroup()` (2认同)

can*_*156 6

这是 @Joshua Ulrich 的函数解决方案。这种格式允许您以与使用 duplicated() 相同的方式使用此代码:

allDuplicated <- function(vec){
  front <- duplicated(vec)
  back <- duplicated(vec, fromLast = TRUE)
  all_dup <- front + back > 0
  return(all_dup)
}
Run Code Online (Sandbox Code Playgroud)

使用相同的示例:

vec <- c("a", "b", "c","c","c") 
allDuplicated(vec) 
[1] FALSE FALSE  TRUE  TRUE  TRUE

Run Code Online (Sandbox Code Playgroud)