【发布时间】: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) & 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
有谁知道为什么会出现这些结果,以及我在使用它时哪里出错了?有没有一种简单(最好是不冗长)的方法?
【问题讨论】:
-
使用
tidyverse我刚刚尝试过这个:test1 <- test %>% filter(!(duplicated(id) | duplicated(cat1) | duplicated(cat2)))对我来说是“过滤结果不是 id OR cat1 OR cat2 的副本,我认为这会起作用,但这只是得出一个结果(5 ba),也不是重复的。
标签: r dataframe duplicates conditional data-cleaning