【问题标题】:R seems duplicated() to select the wrong duplicatesR 似乎 duplicated() 选择了错误的重复项
【发布时间】:2017-11-04 00:01:26
【问题描述】:

我现在已经注意到几次,当我使用 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) &amp; duplicated(test$cat1) &amp; 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

有谁知道为什么会出现这些结果,以及我在使用它时哪里出错了?有没有一种简单(最好是不冗长)的方法?

【问题讨论】:

  • 使用 tidyverse 我刚刚尝试过这个:test1 &lt;- test %&gt;% filter(!(duplicated(id) | duplicated(cat1) | duplicated(cat2))) 对我来说是“过滤结果不是 id OR cat1 OR cat2 的副本,我认为这会起作用,但这只是得出一个结果(5 ba),也不是重复的。

标签: r dataframe duplicates conditional data-cleaning


【解决方案1】:

我们需要在data.framematrixvector 上申请duplicated

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。

而不是“x1”、“x2”等。

正如@Aaron 在 cmets 中提到的,从 OP 的数据中子集重复项

test[duplicated(test),]

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

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

【讨论】:

  • 很好的解释,虽然我建议添加实际上可以从 OP 的示例中找到重复项的代码 (test[duplicated(test),])
【解决方案2】:

单独复制列与复制数据框或矩阵不同。这个例子更清楚了:

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,所以它被复制了。y 已经有一个 3,所以它被复制了。”这并不意味着它已经看到了 x = 1 和 y = 3 的行。

【讨论】:

  • 很好的解释,虽然我建议添加实际上可以从 OP 的示例中找到重复项的代码 (test[duplicated(test),])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
相关资源
最近更新 更多