2014-01-13 43 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