在多列中重复

时间:2012-12-06 11:14:50

标签: r dataframe duplicate-removal

我有一个像这样的数据框

> df
  a  b c    d
1 1  2 A 1001
2 2  4 B 1002
3 3  6 B 1002
4 4  8 C 1003
5 5 10 D 1004
6 6 12 D 1004
7 7 13 E 1005
8 8 14 E 1006

我想删除列c和列d中重复值的行。因此,在此示例中,行2,3,5和6将被删除。

我已经使用了它,它有效:

df[!(df$c %in% df$c[duplicated(df$c)] & df$d %in% df$d[duplicated(df$d)]),]
>df
  a  b c    d
1 1  2 A 1001
4 4  8 C 1003
7 7 13 E 1005
8 8 14 E 1006

但看起来很笨重,我不禁想到有更好的方法。 有什么建议吗?

如果有人想重新创建数据框,请输入:

df = structure(list(a = c(1, 2, 3, 4, 5, 6, 7, 8), b = c(2, 4, 6, 
8, 10, 12, 13, 14), c = structure(c(1L, 2L, 2L, 3L, 4L, 4L, 5L, 
5L), .Label = c("A", "B", "C", "D", "E"), class = "factor"), 
    d = c(1001, 1002, 1002, 1003, 1004, 1004, 1005, 1006)), .Names = c("a", 
"b", "c", "d"), row.names = c(NA, -8L), class = "data.frame")

2 个答案:

答案 0 :(得分:26)

如果您使用duplicated两次,则可以使用

df[!(duplicated(df[c("c","d")]) | duplicated(df[c("c","d")], fromLast = TRUE)), ]

  a  b c    d
1 1  2 A 1001
4 4  8 C 1003
7 7 13 E 1005
8 8 14 E 1006

答案 1 :(得分:20)

使用2列创建一个新对象:

df_dups <- df[c("c", "d")]

现在将它应用到你的主df:

df[!duplicated(df_dups),]

看起来更整洁,更容易查看/更改您正在使用的列。