2016-05-23 10 views
8

में आदेश रखने मैं एक वेक्टर है, vec1 कहते हैं, और एक अन्य वेक्टर के रूप में नामित किया गया vec2 इस प्रकार है:दो वैक्टर की सभी संभव संयोजनों जबकि आर

vec1 = c(4,1) 
# [1] 4 1 

vec2 = c(5,3,2) 
# [1] 5 3 2 

क्या मैं के लिए देख रहा हूँ vec1 के सभी संभव संयोजनों है और vec2 जबकि वैक्टर के तत्वों का क्रम रखा जाता है। यही है, परिणामस्वरूप मैट्रिक्स इस तरह होना चाहिए:

> res 
     [,1] [,2] [,3] [,4] [,5] 
[1,] 4 1 5 3 2 
[2,] 4 5 1 3 2 
[3,] 4 5 3 1 2 
[4,] 4 5 3 2 1 
[5,] 5 4 1 3 2 
[6,] 5 4 3 1 2 
[7,] 5 4 3 2 1 
[8,] 5 3 4 1 2 
[9,] 5 3 4 2 1 
[10,] 5 3 2 4 1 

# res=structure(c(4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 4, 4, 4, 
# 3, 3, 3, 5, 1, 3, 3, 1, 3, 3, 4, 4, 2, 3, 3, 1, 2, 3, 1, 2, 1, 
# 2, 4, 2, 2, 2, 1, 2, 2, 1, 2, 1, 1), .Dim = c(10L, 5L)) 

दो वैक्टरों के लिए दोहराव की अनुमति नहीं है। यही है, परिणामी मैट्रिक्स की सभी पंक्तियों में अद्वितीय तत्व हैं।

मैं वास्तव में सबसे प्रभावी तरीका ढूंढ रहा हूं। इस समस्या से निपटने का एक तरीका है लंबाई की सभी संभावित क्रमिकताओं को उत्पन्न करना जो वास्तविक रूप से बढ़ता है (n=5 यहां) और फिर फ़िल्टरिंग लागू करें। लेकिन यह समय लेने वाली है n बढ़ता है।

क्या ऐसा करने का कोई प्रभावी तरीका है?

+0

तो, यह स्पष्ट है कि आप क्रम-परिवर्तन नहीं करना चाहते हैं, लेकिन वास्तव में क्या आप "आदेश संरक्षण" द्वारा मतलब है? 'Vec2' के सभी तत्व मूल अनुक्रमित क्रम में (और' vec1' के लिए समान) में प्रकट होना चाहिए, लेकिन इस पर कोई सीमा नहीं है कि एक इनपुट का तत्व दूसरे के किसी भी तत्व से पहले है या नहीं? अगला, क्या होगा यदि दोनों वैक्टरों में एक आम मूल्य है? या यह गारंटी नहीं है कि ऐसा न हो? –

उत्तर

13

इस एक का प्रयास करें:

nv1 <- length(vec1) 
nv2 <- length(vec2) 
n <- nv1 + nv2 

result <- combn(n,nv1,function(v) {z=integer(n);z[v]=vec1;z[-v]=vec2;z}) 

विचार vec1 के तत्वों डाल करने के लिए, जिस पर सूचकांक के सभी संयोजनों का उत्पादन होता है।

+0

बहुत बहुत धन्यवाद! बहुत अच्छा विचार है। बस एक मामूली संपादन। 'टी (परिणाम) 'वापस नहीं किया जाना चाहिए। – 989

2

ऐसा नहीं है कि सुरुचिपूर्ण मरात Talipov समाधान के रूप में है, लेकिन आप कर सकते हैं:

# get the ordering per vector 
cc <- c(order(vec1,decreasing = T), order(vec2, decreasing = T)+length(vec1)) 
cc 
[1] 1 2 3 4 5 

# permutation to get all "order-combinations" 
library(combinat) 
m <- do.call(rbind, permn(cc)) 

# remove unsorted per vector, only if both vectors are correct set TRUE for both: 
gr <- apply(m, 1, function(x){ 
      !is.unsorted(x[x < (length(vec1)+1)]) & !is.unsorted(x[x > (length(vec1))]) 
     }) 

# result, exchange the order index with the vector elements: 
t(apply(m[gr, ], 1, function(x, y) y[x], c(vec1, vec2))) 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 4 1 5 3 2 
[2,] 4 5 3 1 2 
[3,] 4 5 3 2 1 
[4,] 4 5 1 3 2 
[5,] 5 4 1 3 2 
[6,] 5 4 3 2 1 
[7,] 5 4 3 1 2 
[8,] 5 3 4 1 2 
[9,] 5 3 4 2 1 
[10,] 5 3 2 4 1 
संबंधित मुद्दे