使用R上的duplicated()查找所有重复记录

时间:2018-03-27 00:28:23

标签: r dataframe duplicates

我在R.中有一个问题 我有一个问题的以下示例代码。

> exdata <- data.frame(a = rep(1:4, each = 3), 
+                      b = c(1, 1, 2, 4, 5, 3, 3, 2, 3, 9, 9, 9))
> exdata
   a b
1  1 1
2  1 1
3  1 2
4  2 4
5  2 5
6  2 3
7  3 3
8  3 2
9  3 3
10 4 9
11 4 9
12 4 9
> exdata[duplicated(exdata), ]
   a b
2  1 1
9  3 3
11 4 9
12 4 9

我尝试使用duplicated()函数查找exdata数据框中的所有重复记录,但它只找到重复记录的一部分,因此很难直观地确认是否存在重复记录。

我正在寻找能够返回以下结果的解决方案

   a b
1  1 1
2  1 1
7  3 3
9  3 3
10 4 9
11 4 9
12 4 9

可以使用duplicated()功能找到正确的解决方案吗? 或者有没有办法使用其他功能?
我很感激你的帮助。

1 个答案:

答案 0 :(得分:3)

duplicated返回一个逻辑向量,其长度等于其参数的长度,对应于第二次存在一个值。它有一个数据框的方法duplicated.data.frame,它查找重复的行(因此有一个长度为nrow(exdata)的逻辑向量。使用它作为逻辑向量的提取将准确返回那些行曾经发生过一次。然而,它不会返回那些行的第一次出现。

查看您使用的索引向量:

duplicated(exdata)
# [1] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE

但您可以将其与fromLast = TRUE结合使用以获取这些行的所有匹配项:

exdata[duplicated(exdata) | duplicated(exdata, fromLast = TRUE),]
#    a b
# 1  1 1
# 2  1 1
# 7  3 3
# 9  3 3
# 10 4 9
# 11 4 9
# 12 4 9

查看duplicated(exdata, fromLast = TRUE)的逻辑向量,以及与duplicated(exdata)的组合来说服自己:

duplicated(exdata, fromLast = TRUE)
#  [1]  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE
duplicated(exdata) | duplicated(exdata, fromLast = TRUE)
# [1]  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE