Удаление дубликатов комбинаций (независимо от порядка) - PullRequest
12 голосов
/ 27 января 2012

У меня есть фрейм данных целых чисел, который является подмножеством всех n, выберите 3 комбинации из 1 ... n. Например, для n = 5 это что-то вроде:

      [,1] [,2] [,3]
 [1,]    1    2    3
 [2,]    1    2    4
 [3,]    1    2    5
 [4,]    1    3    4
 [5,]    1    3    5
 [6,]    1    4    5
 [7,]    2    1    3
 [8,]    2    1    4
 [9,]    2    1    5
[10,]    2    3    4
[11,]    2    3    5
[12,]    2    4    5
[13,]    3    1    2
[14,]    3    1    4
[15,]    3    1    5
[16,]    3    2    4
[17,]    3    2    5
[18,]    3    4    5
[19,]    4    1    2
[20,]    4    1    3
[21,]    4    1    5
[22,]    4    2    3
[23,]    4    2    5
[24,]    4    3    5
[25,]    5    1    2
[26,]    5    1    3
[27,]    5    1    4
[28,]    5    2    3
[29,]    5    2    4
[30,]    5    3    4

Что я хотел бы сделать, так это удалить все строки с дублирующимися комбинациями независимо от порядка. Например, [1,] 1 2 3 совпадает с [1,] 2 1 3 совпадает с [1,] 3 1 2.

unique, duplicated и т. Д. не принимайте это во внимание. Кроме того, я работаю с довольно большим объемом данных (n ~ 750), поэтому это должна быть довольно быстрая операция. Существуют ли базовые функции или пакеты, которые могут это сделать?

1 Ответ

22 голосов
/ 27 января 2012

Просто сначала отсортируйте строки. Что-то вроде:

> dat = matrix(scan('data.txt'), ncol=3, byrow=T)
Read 90 items
> dat.sort = t(apply(dat, 1, sort))
> dat[!duplicated(dat.sort),]
      [,1] [,2] [,3]
 [1,]    1    2    3
 [2,]    1    2    4
 [3,]    1    2    5
 [4,]    1    3    4
 [5,]    1    3    5
 [6,]    1    4    5
 [7,]    2    3    4
 [8,]    2    3    5
 [9,]    2    4    5
[10,]    3    4    5
...