आर

2012-07-02 9 views
5

में सेट की एक निश्चित संख्या में अज्ञात लंबाई का अनुक्रम विभाजित करना मेरे पास एक अनुक्रम है जो लंबाई में भिन्न होता है उदा। कुछ की तरह:आर

items <- 1:4 

मैं इसे सेट की n संख्या के हर संभव संयोजन में विभाजित करना चाहते हैं। तो कहते हैं कि n दो है, मैं वापस जाने के लिए चाहते हैं:

Set A Set B 
----- ----- 
1  2 3 4 
1 2  3 4 
1 2 3 4 
1 3  2 4 

आदि व्यवस्था सेट के भीतर कोई फर्क नहीं पड़ता अर्थात सेट {1, 2, 3} {2, 1, 3} के समान है। सेट खाली नहीं हो सकता है।

बेस्ट मैं (पैकेज combinat से permn का प्रयोग करके) के साथ आ सकता है:

n <- 2 
r <- 1:length(items) 
arrangements <- NULL 
for (i in 1:(n-1)) { 
    A <- r[(1:i)] 
    B <- r[-(1:i)] 
    arrangements <- c(arrangements, apply(do.call(rbind, permn(1:length(items))), 1, function(z) list(z[A], z[B]))) 
} 

कौन सा काफी बेकार है क्योंकि यह सेट कि बराबर यानी हैं रिटर्न {1, 2, 3} और {2, 1, 3} और n के विभिन्न मानों को संभालने के लिए पर्याप्त लचीला नहीं है। किसी के पास कोई विचार है कि मैं यह कैसे कर सकता हूं? धन्यवाद।

उत्तर

5

वहाँ एक 'के सेट' पैकेज है:

require(sets) 
power_set(1:4) 
sapply(set_power(1:4) , function(x) set_complement(x ,as.set(1:4))) 
list(Set_A = as.list(set_power(1:4)), 
     Set_B = sapply(set_power(1:4) , function(x) set_complement(x ,as.set(1:4)))) 

ऐसा लगता है कि जोड़ियां भी शामिल है ({1,2,3,4} {}) जो एक सेट सिद्धांत दृष्टिकोण से सही है, लेकिन आप चाहते हो सकता है उन्हें "अपमानजनक" के रूप में खत्म करने के लिए। (। जिस तरह से अब Set_B परिणाम पर पुनरावर्ती काम करके बड़ा एन को यह सामान्यीकरण करने के लिए स्पष्ट है)

1

यहाँ एक अन्य तरीका है, जो आपकी मदद कर सकता है:

# Params 
n <- 2 
items <- 1:4 

# Sample 
l <- lapply(items, function(x) combn(items, x, simplify=F)) 
l <-unlist(l, recursive=F) 

# devide into sets 
tmp <- 1:length(l) 
tmp <- split(tmp, sample(1:n, length(l), replace=T)) 

sets <- lapply(tmp, function(x) l[x])