删除重复的2列排列

时间:2012-12-29 03:42:27

标签: r duplicates dataframe

我找不到这个问题的好标题,所以请随意编辑。

我有这个data.frame

  section time to from
1       a    9  1    2
2       a    9  2    1
3       a   12  2    3
4       a   12  2    4
5       a   12  3    2
6       a   12  3    4
7       a   12  4    2
8       a   12  4    3

我想同时删除同时具有相同tofrom的重复行,而不计算2列的排列:例如(1,2)和(2,1)重复。< / p>

所以最后的输出是:

  section time to from
1       a    9  1    2
3       a   12  2    3
4       a   12  2    4
6       a   12  3    4

我有一个解决方案,即构建一个新的列密钥,例如

  key <- paste(min(to,from),max(to,from))

并使用duplicated删除重复的密钥,但我认为这是一个肮脏的解决方案。

这里是我数据的输入

structure(list(section = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), .Label = "a", class = "factor"), time = c(9L, 9L, 12L, 
12L, 12L, 12L, 12L, 12L), to = c(1L, 2L, 2L, 2L, 3L, 3L, 4L, 
4L), from = c(2L, 1L, 3L, 4L, 2L, 4L, 2L, 3L)), .Names = c("section", 
"time", "to", "from"), row.names = c(NA, -8L), class = "data.frame")

2 个答案:

答案 0 :(得分:5)

mn <- pmin(s$to, s$from)
mx <- pmax(s$to, s$from)
int <- as.numeric(interaction(mn, mx))
s[match(unique(int), int),]
  section time to from
1       a    9  1    2
3       a   12  2    3
4       a   12  2    4
6       a   12  3    4

这个想法归功于这个问题:Remove consecutive duplicates from dataframe,特别是@ MatthewPlourde的答案。

答案 1 :(得分:3)

您可以尝试使用sort功能中的apply来对组合进行排序。

mydf[!duplicated(t(apply(mydf[3:4], 1, sort))), ]
#   section time to from
# 1       a    9  1    2
# 3       a   12  2    3
# 4       a   12  2    4
# 6       a   12  3    4