2016-08-05 20 views
8

tôi có một danh sách một số (biến) số của các chữ cái kết hợp, ví dụ này:R điền giá trị tùy thuộc vào sự kết hợp

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 với mỗi sự kết hợp, tôi đang cố gắng để điền vào các yếu tố phụ thuộc vào vị trí, thành các vectơ có cùng độ dài với số lượng vectơ. Vì vậy, tôi đang cố gắng để có được:

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

Ngay bây giờ tôi đang cố gắng với các vòng thay thế từng phần tử của một mảng i, j nhưng vì tất cả các giá trị được "2" có phải là một cách hiệu quả hơn để làm điều này? Cảm ơn rất nhiều !!

Trả lời

9

Bắt đầu chỉ từ vec, bạn có thể làm ...

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 

Có một hàng trống cho tập rỗng, vì có lẽ nên được.

Từ đây ...

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 là chậm, nhưng có thể được cố định lên sau này nếu nó quan trọng.

+2

'comb_cases' khá thông minh ở đó –

6

này vẫn là cơ bản một vòng lặp, nhưng nó có thể được dễ dàng hơn để hiểu:

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

Dưới đây là một lựa chọn khác nhau với factor

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

Chúng tôi cũng có thể tận dụng các Đối số FUN trong 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" 

Hoặc trong một phiên bản hơi nhỏ gọn

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" 
Các vấn đề liên quan