我已经注意了几次,当我使用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
有谁知道为什么会出现这些结果,以及我在哪里使用它?这样做是否有一种简单(理想情况下非冗长)的方式?
答案 0 :(得分:2)
我们需要在duplicated
或data.frame
或matrix
vector
i1 <- duplicated(test[c('id', 'cat1')])
i2 <- duplicated(cbind(test$id, test$cat1))
identical(i1, i2)
#[1] TRUE
而不是多个data.frame
或matrix
或vector
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的行。