删除子集中的某些重复行

时间:2014-11-06 20:22:25

标签: r rstudio duplicate-removal

我有以下两列的数据集

x   y
1   3
1   4
1   5
1   4
1   2
2   6
2   3
2   4
2   4
3   4
3   2
3   4
3   4
3   6
3   2

对于给定的x,我想删除所有重复的y。所以我想删除第4,9,12,13,15行。我不想删除任何y = 3行,因为即使它们重复,它们也会出现不同的x

4 个答案:

答案 0 :(得分:0)

您可以使用data.table

library(data.table)
setDT(df)[df[, !duplicated(y), by=x]$V1]
#    x y
#1: 1 3
#2: 1 4
#3: 1 5
#4: 1 2
#5: 2 6
#6: 2 3
#7: 2 4
#8: 3 4
#9: 3 2
#10: 3 6

@David Arenburg建议的其他选项,@ Arun

 setDT(df)[, .SD[!duplicated(y)], by = x]
 unique(setDT(df), by=c("x", "y"))

数据

df <- structure(list(x = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 
3L, 3L, 3L, 3L, 3L), y = c(3L, 4L, 5L, 4L, 2L, 6L, 3L, 4L, 4L, 
4L, 2L, 4L, 4L, 6L, 2L)), .Names = c("x", "y"), class = "data.frame", row.names =
c(NA, -15L))

答案 1 :(得分:0)

使用aveduplicated的方法:

> subset(dat, !ave(y, x, FUN = duplicated))
   x y
1  1 3
2  1 4
3  1 5
5  1 2
6  2 6
7  2 3
8  2 4
10 3 4
11 3 2
14 3 6

答案 2 :(得分:0)

如果您的数据中只有两列,请执行unique(df)(如前所述)。

如果您有两列以上,那么您还可以尝试dplyr的包distinct功能,以便明确指定xy

library(dplyr)
distinct(df, x, y)
#    x y
# 1  1 3
# 2  1 4
# 3  1 5
# 4  1 2
# 5  2 6
# 6  2 3
# 7  2 4
# 8  3 4
# 9  3 2
# 10 3 6

答案 3 :(得分:0)

当我寻找类似的答案时,我意识到这里缺少使用重复的方法。 您可以简单地使用duplicated()函数并传递不同的列。 您可以根据需要在任意列上执行此操作。它将在搜索重复行时考虑列。

    df <- data.frame(matrix(data=c(1,2,1,4,1,3,1,4,2,2,2,5,2,4), ncol=2, byrow = T))
> duplicated(df[, c(1,2)])
[1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE

    toremove <- duplicated(df[, c(1,2)])
    df <- df[!toremove, ]

或直接

df <- df[!duplicated(df[, c(1,2)]), ]

duplicated()函数非常方便。