2016-08-05 15 views
8

に応じた値Iの組み合わせの文字のいくつかの(可変)番号のリストを持っているが、例えばこれを満たす:各組合せについてRは組み合わせ

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は、位置に応じて要素を充填しようとしていベクトルの数と同じ長さのベクトルに変換する。だから私は、取得しようとしています:

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

は、今私は、ループは、配列I、Jの各要素を交換するとしようとしていますが、すべての値が「2」であるため、これを行うには、より効率的な方法が存在しなければなりませんか? ありがとうございました!

答えて

9

で...

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" 

と異なるオプションですFUN引数のcombn

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" 

それとも、あなたが行うことができ、vecから始めて少しコンパクト版

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"