2015-06-16 12 views
6

से छोटे वैक्टर मैं वैक्टर की एक सूची है, कहते हैं:निकालें डुप्लिकेट और सूची

li <- list(c(1, 2, 3), 
      c(1, 2, 3, 4), 
      c(2, 3, 4), 
      c(5, 6, 7, 8, 9, 10, 11, 12), 
      numeric(0), 
      c(5, 6, 7, 8, 9, 10, 11, 12, 13) 
      ) 

और मैं (बड़ा या बराबर) सभी वैक्टर कि पहले से ही दूसरों में निहित हैं दूर करने के लिए, साथ ही चाहते हैं सभी खाली वैक्टर

इस मामले में, मैं केवल सूची

1 2 3 4 
5 6 7 8 9 10 11 12 13 

इस प्राप्त करने के लिए किसी भी उपयोगी समारोह है के साथ छोड़ दिया जाएगा?

धन्यवाद अग्रिम में

+0

पर एक नजर डालें [इस उत्तर] (http://stackoverflow.com/a/27521122/3521006) - मुझे लगता है कि यह आप के लिए क्या देख रहे हो जाएगा (बस किसी सूची में अपने वैक्टर डाल) –

+0

असल में, मैं जो हासिल करना चाहता हूं वह कुछ अलग है: सबसे पहले, मैं खाली वैक्टर से छुटकारा पाउंगा। दूसरा, मैं पहले से ही दूसरों में निहित वैक्टर को हटाना चाहता हूं ... – Ruggero

उत्तर

2

सबसे पहले आपको वेक्टर लंबाई से सूची को सॉर्ट करना चाहिए, जैसे कि एक्ज़िशन लूप में यह गारंटी दी जाती है कि प्रत्येक निचला इंडेक्स वेक्टर प्रत्येक उच्च-सूचकांक वेक्टर से छोटा होता है, इसलिए एक तरफा setdiff() आपको चाहिए।

l <- list(1:3, 1:4, 2:4, 5:12, double(), 5:13); 
ls <- l[order(sapply(l,length))]; 
i <- 1; while (i <= length(ls)-1) if (length(ls[[i]]) == 0 || any(sapply((i+1):length(ls),function(i2) length(setdiff(ls[[i]],ls[[i2]]))) == 0)) ls[[i]] <- NULL else i <- i+1; 
ls; 
## [[1]] 
## [1] 1 2 3 4 
## 
## [[2]] 
## [1] 5 6 7 8 9 10 11 12 13 

यहाँ एक मामूली विकल्प है, एक दूसरे जबकि लूप के साथ any(sapply(...)) की जगह। इसका फायदा यह है कि समय-लूप समय-समय पर तोड़ सकता है अगर उसे सूची के बाकी हिस्सों में कोई सुपरसेट मिल जाए।

l <- list(1:3, 1:4, 2:4, 5:12, double(), 5:13); 
ls <- l[order(sapply(l,length))]; 
i <- 1; while (i <= length(ls)-1) if (length(ls[[i]]) == 0 || { j <- i+1; res <- F; while (j <= length(ls)) if (length(setdiff(ls[[i]],ls[[j]])) == 0) { res <- T; break; } else j <- j+1; res; }) ls[[i]] <- NULL else i <- i+1; 
ls; 
## [[1]] 
## [1] 1 2 3 4 
## 
## [[2]] 
## [1] 5 6 7 8 9 10 11 12 13 
0

एक्स अगर

length(setdiff(x, y)) == 0 

y में निहित है आप इसे expand.grid या combn जैसे कार्यों का उपयोग कर वैक्टर की प्रत्येक जोड़ी के लिए आवेदन कर सकते।

+0

क्या यह दृष्टिकोण अनावश्यक रूप से दोहराया नहीं जाएगा? यदि आप कई संयोजनों को आजमाते हैं तो आप कई बार एक हटाने योग्य तत्व की जांच कर रहे हैं, तो आपको केवल एक बार ऐसा करने की आवश्यकता है। – Molx

संबंधित मुद्दे