2016-08-05 42 views
8

Mam listę kilku (zmienna) liczby liter w kombinacji, na przykład w ten sposób:R wypełnić wartości w zależności od kombinacji

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 

Dla każdej kombinacji, staram się wypełnić elementy w zależności od położenia, do wektorów o tej samej długości co liczba wektorów. Więc staram się dostać:

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

Teraz staram się pętle zastępując każdy element tablicy I, J, ale ponieważ wszystkie wartości są „2” musi być bardziej efektywny sposób to zrobić? Dziękuję bardzo!

Odpowiedz

9

Wychodząc właśnie od vec można zrobić ...

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 

Jest pusty wiersz do zbioru pustego, ponieważ prawdopodobnie powinno być.

Stąd ...

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 jest powolny, ale że może być ustalony później, jeśli to ma znaczenie.

+2

'comb_cases' jest całkiem sprytnie –

6

To wciąż zasadzie pętli, ale to może być łatwiejsze do zrozumienia:

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

Oto inna opcja z factor

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

Możemy również skorzystać z następujących Argument FUN w 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" 

albo w nieco wersji kompaktowej

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"