检查重复项是否跨过R中的两列

时间:2018-10-02 18:01:53

标签: r duplicates

例如,我的数据集如下:

  Var1 Var2 value
1  ABC  BCD   0.5
2  DEF  CDE   0.3
3  CDE  DEF   0.3
4  BCD  ABC   0.5

uniqueduplicated可能无法检测到第3行和第4行的重复。

由于我的数据集非常大,是否有任何有效的方法来仅保留唯一的行? 像这样:

  Var1 Var2 value
1  ABC  BCD   0.5
2  DEF  CDE   0.3

为了说服,您可以使用:

dat <- data.frame(Var1 = c("ABC", "DEF", "CDE", "BCD"),
                  Var2 = c("BCD", "CDE", "DEF", "ABC"),
                  value = c(0.5, 0.3, 0.3, 0.5))

此外,如有可能,还可以根据Var1(超过10,000个级别)为前20个变量生成一个分布表。

P.S。我已经尝试过dat$count <- dat(as.character(dat$Var1))[as.character(dat$Var1)],但运行时间太长。

2 个答案:

答案 0 :(得分:2)

另一种选择是按行对列Var1Var2进行排序,然后应用duplicated

idx <- !duplicated(t(apply(dat[c("Var1", "Var2")], 1, sort)))
dat[idx, ]
#  Var1 Var2 value
#1  ABC  BCD   0.5
#2  DEF  CDE   0.3

答案 1 :(得分:0)

我将从首先对value1和value2进行排序开始,然后使用unique。如果只有两列,则只能使用pmanpmin

dat <- data.frame(
   Var1 = c("ABC", "DEF", "CDE", "BCD"),
   Var2 = c("BCD", "CDE", "DEF", "ABC"),
   value = c(0.5, 0.3, 0.3, 0.5))


library(dplyr)
dat %>% mutate(v1 = pmax(as.character(Var1), as.character(Var2)),
               v2 = pmin(as.character(Var1), as.character(Var2))) %>%
  select(v1, v2, value) %>% unique()

#   v1  v2 value
# 1 BCD ABC   0.5
# 2 DEF CDE   0.3

但是,当您有更多列VarN时,情况可能会有些复杂。