我有一个如下列表:
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
和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"
第一个和第二个字符串以及第三个和第四个字符串是相同的。 我想要的结果是:
"2 * A_1 * A_0 * B_0 * B_0"
"2 * A_0 * A_0 * B_1 * B_0"
有优雅的方法吗?我考虑在A
中添加B
和all.combns
的行,例如cbind(all.combns[,1]+all.combns[,2], all.combns[,3]+all.combns[,3])
然后使用描述here的方法计算唯一元素。但是,我认为必须有一个更简单的解决方案,而不是与expand.grid
形成所有组合。
答案 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"