2014-01-13 41 views
0

我有一個列表可能的組合如下:ř創建的變量

mylist <- list(A=seq_len(3)-1, A=seq_len(3)-1, B=seq_len(2)-1, B=seq_len(2)-1) 

mylist 

$A 
[1] 0 1 2 

$A 
[1] 0 1 2 

$B 
[1] 0 1 

$B 
[1] 0 1 

也就是說的A兩個實例可以具有的狀態0,1,2和B兩個實例可以具有的狀態0,1 。

我想產生具有所有實例,用於哪些狀態的總和的所有組合的產品的字符串(作爲一個例子)1.

我通過首先獲得所有潛在組合,兩者A這樣做' S和B's和服用所述子集的量,總和爲1

all.combns <- expand.grid(mylist) 
ac <- all.combns[which(rowSums(all.combns)==1),] 
unname(apply(ac, 1, function(x)paste(colnames(ac), x, sep="_", collapse=" * "))) 

結果是:

"A_1 * A_0 * B_0 * B_0" 
"A_0 * A_1 * B_0 * B_0" 
"A_0 * A_0 * B_1 * B_0" 
"A_0 * A_0 * B_0 * B_1" 

第一和塞康d字符串和第三和第四個字符串是相同的。 我期望的結果將是:

"2 * A_1 * A_0 * B_0 * B_0" 
"2 * A_0 * A_0 * B_1 * B_0" 

有一種優雅的方式來做到這一點?我考慮過在all.combns例如AB的行中添加行。然後用here所述的方法對獨特元素進行計數。不過,我認爲必須有一個更簡單的解決方案,而不必與expand.grid形成所有組合。

+0

@ user1987175 - 在問候你的審查,這個答案在這裏(http://stackoverflow.com/review/low-quality-posts/3871248#./3871248?&_suid=139040787868004590174438491092)顯然不是一個回答;請在審覈時更加小心。 – LittleBobbyTables

回答

1

這是一個解決方案。但我想有更簡潔的餘地。我更改了paste步驟,因此在創建字符串之前結果將被排序,因爲順序在您的情況下似乎不重要。然後用ddply來計算相同的情況。

ac <- cmbs[rowSums(cmbs) == 1,] 
a <- data.frame(v=apply(ac, 1, function(x) 
    paste(sort(paste(colnames(ac), x, sep="_")), collapse=" * "))) 
d <- ddply(a, .(v), summarise, new = paste(length(v), "*", unique(v))) 
d[, "new"] 

"2 * A_0 * A_0 * B_0 * B_1" "2 * A_0 * A_1 * B_0 * B_0" 
+0

感謝您使用'plyr'解決方案。對於這個例子,它工作正常,但是我仍然在考慮如何避免使用'expand.grid'來計算所有組合,因爲在我的真實應用中,我有一個列表,其中包含六個值爲0到4的'A'實例和'B'中的6個從0到to,這使得5^6 * 3^6 = 11390625個組合 – user1981275