2016-08-05 17 views
8

के आधार पर मैं, उदाहरण के लिए इस संयोजन में पत्र के कई (चर) नंबर की एक सूची है भरने:आर मान संयोजन

vec = c("a", "b", "c") 
comb = unlist(lapply(1:length(vec), combn, x = vec, simplify = FALSE), recursive = FALSE) 
# this creates all the combinations of the vector I am interested in, i.e. for three letters: 
# a b c ab ac bc abc 

प्रत्येक संयोजन के लिए, मैं तत्वों स्थिति के आधार पर भरने के लिए कोशिश कर रहा हूँ, वेक्टरों की संख्या के समान लंबाई वाले वैक्टर में। इसलिए मैं पाने के लिए कोशिश कर रहा हूँ: मैं छोरों एक सरणी i, j की लेकिन सभी मूल्यों के बाद से प्रत्येक तत्व की जगह के साथ कर रहे हैं कोशिश कर रहा हूँ

a = 200 
b = 020 
c = 002 
ab = 220 
ac = 202 
bc = 022 
abc = 222 

अभी "2" वहाँ यह करने के लिए एक अधिक कुशल तरीका होना चाहिए? बहुत बहुत धन्यवाद !!

उत्तर

9

सिर्फ vec से, आप कर सकते हैं शुरू में ...

comb_cases = do.call(expand.grid, lapply(vec, function(x) c("", x))) 

    Var1 Var2 Var3 
1    
2 a   
3   b  
4 a b  
5    c 
6 a   c 
7   b c 
8 a b c 

वहाँ खाली सेट के लिए एक रिक्त पंक्ति है, वहाँ के रूप में शायद होना चाहिए।

यहाँ से ...

comb = do.call(paste0, comb_cases) 
# [1] "" "a" "b" "ab" "c" "ac" "bc" "abc" 

do.call(paste0, split(ifelse(nchar(as.matrix(comb_cases)), 2, 0), col(comb_cases))) 
# [1] "000" "200" "020" "220" "002" "202" "022" "222" 

ifelse धीमी है, लेकिन वह बाद में तय किया जा सकता है अगर यह मायने रखती है।

+2

'comb_cases' बहुत सुंदर चालाक है –

6

यह अभी भी अनिवार्य रूप से एक पाश है, लेकिन यह समझने के लिए आसान हो सकता है:

sapply(lapply(comb, match, vec), function(x) paste(replace(numeric(3), x, 2), collapse="")) 
#[1] "200" "020" "002" "220" "202" "022" "222" 
5

यहाँ factor

sapply(comb, function(x) paste(table(factor(x, levels = vec))*2, collapse="")) 
#[1] "200" "020" "002" "220" "202" "022" "222" 

के साथ एक अलग विकल्प हम यह भी का उपयोग कर सकते है FUNcombn

unlist(sapply(seq_along(vec), function(x) combn(vec, x, 
    FUN = function(y) paste(table(factor(y, levels= vec))*2, collapse='')))) 
#[1] "200" "020" "002" "220" "202" "022" "222" 
में तर्क

या एक से थोड़ा कॉम्पैक्ट संस्करण

unlist(lapply(seq_along(vec), function(x) combn(vec, x, FUN = 
     function(y) paste((vec %in% y)*2, collapse="")))) 
#[1] "200" "020" "002" "220" "202" "022" "222" 
संबंधित मुद्दे