R创建可能的变量组合

时间:2014-01-13 17:15:27

标签: r

我有一个如下列表:

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。

我首先获取AB'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"

第一个和第二个字符串以及第三个和第四个字符串是相同的。 我想要的结果是:

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

有优雅的方法吗?我考虑在A中添加Ball.combns的行,例如cbind(all.combns[,1]+all.combns[,2], all.combns[,3]+all.combns[,3])然后使用描述here的方法计算唯一元素。但是,我认为必须有一个更简单的解决方案,而不是与expand.grid形成所有组合。

1 个答案:

答案 0 :(得分: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"