2012-01-28 7 views
2

2つのトリートメント(A、B)の6つの組み合わせを4つのブロックで生成するにはどうすればよいですか?各ブロックにAとBの数は同じですか?制約がある場合、すべての組み合わせを生成する

"AABB","ABAB","ABBA","BBAA","BABA","BAAB" 

P.S.以下のような組み合わせの数が計算されます。

組み合わせの数がn!/[k!*k! (T times)]

に等しい

T = #treatments 

n = #treatments in each block = k*T, 

場合は、このような

+0

サイドクエリ:組み合わせの数がnであることを意味しますか。 /((k!)^ T)? –

+0

@Carl Witthoft yes: - P –

答えて

3

何かが動作するはずありがとう:

library(gtools) 

t <- c('A','B') 
k <- 2 
n <- k * length(t) 

t2 <- rep(t, k) 
m <- permutations(n,n) 
res <- unique(apply(m,MARGIN=1,function(x) paste(t2[x],collapse=''))) 

-------------------------------------------------------------------- 
res 
[1] "ABAB" "ABBA" "AABB" "BAAB" "BABA" "BBAA" 
1

multicool pac kageはマルチセットの置換アルゴリズムを実装しています。つまり、実行したいタスクです。ここではそれが何ができるかの例を示します。

library(multicool) 

# Create a simple convenience function 
enumAllPartitions <- function(multiset) { 
    m1 <- initMC(multiset)  # Initialize the permutation object 
    N <- fact(length(multiset))/ # Calculate number of permutations 
     prod(fact(table(multiset))) 
    sapply(seq_len(N), function(X) paste(nextPerm(m1), collapse="")) 
} 

# Try it out with a few different multisets 
x <- c("A", "A", "B", "B") 
y <- c("G", "L", "L", "L") 
z <- c("X", "X", "Y", "Z", "Z") 

lapply(list(x,y,z), enumAllPartitions) 
[[1]] 
[1] "BBAA" "ABBA" "BABA" "ABAB" "AABB" "BAAB" 

[[2]] 
[1] "LLLG" "GLLL" "LGLL" "LLGL" 

[[3]] 
[1] "ZZYXX" "XZZYX" "ZXZYX" "ZZXYX" "XZZXY" "ZXZXY" "XZXZY" "XXZZY" "ZXXZY" 
[10] "ZZXXY" "YZZXX" "ZYZXX" "XZYZX" "ZXYZX" "YZXZX" "XYZZX" "YXZZX" "ZYXZX" 
[19] "XZYXZ" "ZXYXZ" "XZXYZ" "XXZYZ" "ZXXYZ" "YZXXZ" "XYZXZ" "YXZXZ" "XYXZZ" 
[28] "XXYZZ" "YXXZZ" "ZYXXZ" 
1

期待されるソリューションは、新しいiterpcパッケージを使用して達成することができます。

I <- iterpc(c(2, 2), labels=c("A", "B"), ordered=TRUE) 
getall(I) 

#  [,1] [,2] [,3] [,4] 
# [1,] "A" "A" "B" "B" 
# [2,] "A" "B" "A" "B" 
# [3,] "A" "B" "B" "A" 
# [4,] "B" "A" "A" "B" 
# [5,] "B" "A" "B" "A" 
# [6,] "B" "B" "A" "A" 
関連する問題