R似乎重复()以选择错误的重复项

时间:2017-06-02 14:22:39

标签: r dataframe duplicates conditional data-cleaning

我已经注意了几次,当我使用R来识别重复时,有时它似乎找出了错误的情况。

这是一个包含三列的数据框,每列可能包含重复值。我想在所有三个变量上隔离与另一个案例重复的案例。

set.seed(100)
test <- data.frame(id = sample(1:15, 20, replace = TRUE),
                     cat1 = sample(letters[1:2], 20, replace = TRUE),
                     cat2 = sample(letters[1:2], 20, replace = TRUE))

这给了我:

   id cat1 cat2
1   5    b    a
2   4    b    b
3   9    b    b
4   1    b    b
5   8    a    b
6   8    a    a
7  13    b    b
8   6    b    b
9   9    b    a
10  3    a    a
11 10    a    a
12 14    b    a
13  5    a    a
14  6    b    a
15 12    b    b
16 11    b    a
17  4    a    a
18  6    b    a
19  6    b    b
20 11    a    a

我尝试了几种方法,例如: duplicated(test$id) & duplicated(test$cat1) & duplicated(test$cat2)

但这只会导致与duplicated(test$id)相同:

[1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE
[17]  TRUE  TRUE  TRUE  TRUE

所以我尝试了duplicated(test$id, test$cat1, test$cat2),这会产生不同的结果:

[1]  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE
[17] FALSE  TRUE FALSE FALSE

但仍然不正确 - 如果我从数据框中调用这些案例,我们得到:

> test[which(duplicated(test$id, test$cat1, test$cat2)),]
   id cat1 cat2
1   5    b    a
2   4    b    b
3   9    b    b
5   8    a    b
8   6    b    b
14  6    b    a
16 11    b    a
18  6    b    a

正如你所看到的那些不是我们应该得到的行(它是否正在做我认为它会做的事情),这应该是(据我所见):

18  6   b   a
19  6   b   b

有谁知道为什么会出现这些结果,以及我在哪里使用它?这样做是否有一种简单(理想情况下非冗长)的方式?

2 个答案:

答案 0 :(得分:2)

我们需要在duplicateddata.framematrix

上应用vector
i1 <- duplicated(test[c('id', 'cat1')])
i2 <- duplicated(cbind(test$id, test$cat1))
identical(i1, i2)
#[1] TRUE

而不是多个data.framematrixvector

i3 <- duplicated(test$id, test$cat1)
identical(i1, i3)
#[1] FALSE

?duplicated

的文件中指明
  

重复(x,不兼容= FALSE,......)

其中

  

x向量或数据框或数组或NULL。

而不是&#39; x1&#39;,&#39; x2&#39;等。

@Aaron在评论中提到,要从OP的数据中对副本进行分组

test[duplicated(test),]

如果我们只想要重复项,那么

test[duplicated(test)|duplicated(test, fromLast = TRUE),]

答案 1 :(得分:1)

单独复制列与使用数据帧或矩阵的副本不同。这个例子更清楚:

df = data.frame(x = c(1,2,1),
                y = c(1,3,3))
df$dupe = duplicated(df$x) & duplicated(df$y)
df$dupe2 = duplicated(df[,c("x","y")])
df

使用你的方法,duplicated说“当我到达第三行时,x已经有一个1,所以它是重复的。你已经有了3,所以它是重复的。”这并不意味着它已经看到了x = 1和y = 3的行。