2012-01-27 35 views
8

Tôi có một khung dữ liệu của các số nguyên là tập hợp con của tất cả n chọn 3 tổ hợp 1 ... n. Ví dụ: với n = 5, nó là một cái gì đó như:Loại bỏ các kết hợp trùng lặp (không phân biệt thứ tự)

 [,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 

Những gì tôi muốn làm là loại bỏ bất kỳ hàng với sự kết hợp trùng lặp, không phụ thuộc vào trật tự. Ví dụ: [1,] 1 2 3 giống với [1,] 2 1 3 giống với [1,] 3 1 2.

unique, duplicated, & c. dường như không tính đến điều này. Ngoài ra, tôi đang làm việc với một lượng lớn dữ liệu (n là ~ 750), do đó, nó phải là một hoạt động khá nhanh. Có bất kỳ chức năng hoặc gói cơ bản nào có thể thực hiện việc này không?

Trả lời

17

Chỉ cần sắp xếp trong các hàng trước. Một cái gì đó như:

> 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 
+0

+1, ngắn và ngọt. –

+0

Hoàn hảo, cảm ơn! Không nghĩ về điều đó. – seanimo

+0

t (combn (c (1: 5), 3)) – aatrujillob

Các vấn đề liên quan