如何从数据中完全删除重复的行?

时间:2020-04-14 20:46:39

标签: r

对于这个问题,我将举一个例子使用Remove duplicated rows using dplyr

set.seed(123)
df = data.frame(x=sample(0:1,10,replace=T),y=sample(0:1,10,replace=T),z=1:10)

> df
   x y  z
1  0 1  1
2  1 0  2
3  0 1  3
4  1 1  4
5  1 0  5
6  0 1  6
7  1 0  7
8  1 0  8
9  1 0  9
10 0 1 10

df[!duplicated(df[,1:2]),]
  x y z
1 0 1 1
2 1 0 2
4 1 1 4

该示例的问题在于它保留一行并删除其他重复的行。我需要完全删除所有重复的行。

最终结果应该只有唯一的一行:

  x y z
4 1 1 4

已在此处回答:How can I remove all duplicates so that NONE are left in a data frame?

谢谢Jaap。我保证我搜索了很多东西,发现的所有结果都和我发布的示例一样。

1 个答案:

答案 0 :(得分:0)

我们也可以将duplicatedfromLast一起使用。对于与第二个元素重复的行,仅duplicated会为TRUE,即,如果值为1, 2, 1, 2 3,则duplicated会得到FALSE, FALSE, TRUE, TRUE, FALSE。为了使第一个和第二个都为TRUE,我们需要反向应用(fromLast = TRUE),然后用|换行给出其中一个

df[!(duplicated(df[,1:2])|duplicated(df[1:2], fromLast = TRUE)),]
#  x y z
#4 1 1 4

或者另一个选择是

library(dplyr)
df %>%
     group_by(x, y) %>%
     filter(n() == 1)

数据

df <- structure(list(x = c(0L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 0L), 
    y = c(1L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 1L), z = 1:10), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))