使用条件仅删除一行重复的行

时间:2018-08-19 00:00:56

标签: r

我的数据框比这个大得多。

但是我想要的是

x = data.frame(
 A= c(3, 4, 5, 7,9),
 B= c(7, 8, 9, 3,5),
 C= c(11, 12, 13, 14,18)
 )

我正在考虑第1行和第4行相同,因为对我来说(3,7)和(7,3)对是相同的(对(5,9)和(9,5)也对)。我只想留下一对。

结果应为:

 x = data.frame(
     A= c(3, 4, 5),
     B= c(7, 8, 9),
     C= c(11, 12, 13)
     )

我该怎么做?

是否可以使用功能subset来做到这一点?

3 个答案:

答案 0 :(得分:3)

library(dplyr)

x <- x %>%
  group_by(A, B) %>%
  mutate(AB = paste0(min(A, B), max(A, B)))

x[!duplicated(x$AB), -4]

# # A tibble: 3 x 3
# # Groups:   A, B [3]
#       A     B     C
#   <dbl> <dbl> <dbl>
# 1     3     7    11
# 2     4     8    12
# 3     5     9    13

答案 1 :(得分:1)

一种base R解决方案。使用ifelsepaste0创建一个结合了AB的变量,并把最小值放在第一位。然后,您可以使用duplicated来标识重复值和子集。

index <- ifelse(x$A<x$B, paste0(x$A, '-', x$B), paste0(x$B, '-', x$A))
index

[1] "3-7" "4-8" "5-9" "3-7" "5-9"

x[!duplicated(index),]

  A B  C
1 3 7 11
2 4 8 12
3 5 9 13

自从您提到subset。它与[]的作用相同。

subset(x, !duplicated(index))

  A B  C
1 3 7 11
2 4 8 12
3 5 9 13

答案 2 :(得分:1)

这是一个base R选项,其中包含pmin/pmaxduplicated

x[!duplicated(with(x, pmin(A, B), pmax(A, B))),]
   A B  C
#1 3 7 11
#2 4 8 12
#3 5 9 13