Câu trả lời trước không có cách nào để có được kết quả cụ thể, giữ nguyên các cặp nhưng loại bỏ các đơn đặt hàng khác nhau. Gói gtools có hai chức năng cho các mục đích này, combinations
và permutations
. According to this website:
- Khi đơn đặt hàng không quan trọng, đó là Kết hợp.
- Khi thứ tự quan trọng, đó là một phép hoán vị.
Trong cả hai trường hợp, chúng tôi có quyết định thực hiện việc lặp lại được phép hay không, và tương ứng, cả hai hàm đều có đối số repeats.allowed
, cho 4 kết hợp (siêu ngon!). Đó là giá trị đi qua mỗi trong số này. Tôi đã đơn giản hóa vector thành các chữ cái đơn để dễ hiểu.
hoán vị với sự lặp lại
Các tùy chọn mở rộng nhất là cho phép cả hai tự quan hệ và cách khác nhau đã ra lệnh lựa chọn:
> permutations(n = 3, r = 2, repeats.allowed = T, v = c("a", "b", "c"))
[,1] [,2]
[1,] "a" "a"
[2,] "a" "b"
[3,] "a" "c"
[4,] "b" "a"
[5,] "b" "b"
[6,] "b" "c"
[7,] "c" "a"
[8,] "c" "b"
[9,] "c" "c"
mà cho chúng ta 9 lựa chọn. Bạn có thể tìm thấy giá trị này từ công thức đơn giản n^r
tức là 3^2=9
. Đây là the Cartesian product/join cho người dùng quen thuộc với SQL.
Có hai cách để giới hạn điều này: 1) loại bỏ mối quan hệ tự (không cho phép lặp lại) hoặc 2) xóa các tùy chọn được sắp xếp khác nhau (tức là kết hợp).
kết hợp với lần lặp lại
Nếu chúng ta muốn loại bỏ cách khác nhau đã ra lệnh lựa chọn, chúng tôi sử dụng:
> combinations(n = 3, r = 2, repeats.allowed = T, v = c("a", "b", "c"))
[,1] [,2]
[1,] "a" "a"
[2,] "a" "b"
[3,] "a" "c"
[4,] "b" "b"
[5,] "b" "c"
[6,] "c" "c"
mà cho chúng ta 6 lựa chọn. Công thức cho giá trị này là (r+n-1)!/(r!*(n-1)!)
tức là (2+3-1)!/(2!*(3-1)!)=4!/(2*2!)=24/4=6
.
hoán vị không lặp lại
Nếu thay vào đó chúng tôi muốn để không cho phép lặp lại, chúng tôi sử dụng:
> permutations(n = 3, r = 2, repeats.allowed = F, v = c("a", "b", "c"))
[,1] [,2]
[1,] "a" "b"
[2,] "a" "c"
[3,] "b" "a"
[4,] "b" "c"
[5,] "c" "a"
[6,] "c" "b"
đó cũng cho chúng ta 6 lựa chọn, nhưng những người khác nhau! Số lượng tùy chọn giống như ở trên nhưng đó là sự trùng hợp ngẫu nhiên. Giá trị có thể được tìm thấy từ công thức n!/(n-r)!
tức là (3*2*1)/(3-2)!=6/1!=6
.
kết hợp mà không lặp lại
Các hạn chế nhất là khi chúng ta muốn không phải tự quan hệ/lần lặp lại hoặc cách khác nhau đã ra lệnh tùy chọn, trong trường hợp này chúng tôi sử dụng:
> combinations(n = 3, r = 2, repeats.allowed = F, v = c("a", "b", "c"))
[,1] [,2]
[1,] "a" "b"
[2,] "a" "c"
[3,] "b" "c"
mà cho chúng ta chỉ có 3 lựa chọn. Số lượng tùy chọn có thể được tính từ công thức khá phức tạp n!/(r!(n-r)!)
tức là 3*2*1/(2*1*(3-2)!)=6/(2*1!)=6/2=3
.
Không phải là [this] (https://stackoverflow.com/questions/12245213/how-to-generate-all-possible-combinations-of-vectors-without-caring-for-order) chỉ là cùng một câu hỏi ? – 5th
Có thể trùng lặp của [Làm thế nào để tạo ra tất cả các kết hợp có thể có của vectơ mà không quan tâm đến trật tự?] (Https://stackoverflow.com/questions/12245213/how-to-generate-all-possible-combinations-of-vectors-without- chăm sóc theo đơn đặt hàng) – 5th
Tôi không nghĩ vậy. Điều đó hỏi về các phần tử từ một vectơ đơn lẻ. các câu trả lời được chấp nhận cũng cung cấp một cách để tạo ra các kết hợp từ các yếu tố của nhiều đầu vào (2 hoặc nhiều hơn) – Michele