我有一个长度不一的序列,例如:
items <- 1:4
Run Code Online (Sandbox Code Playgroud)
我想将它分成每组可能的组合n.所以说n是两个,我想回归:
Set A Set B
----- -----
1 2 3 4
1 2 3 4
1 2 3 4
1 3 2 4
Run Code Online (Sandbox Code Playgroud)
等集内的布置并不重要,即集合{ 1,2,3}是相同的{ 2,1,3}.集不能为空.
我能想到的最好(permn从包中使用combinat)是:
n <- 2
r <- 1:length(items)
arrangements <- NULL
for (i in 1:(n-1)) {
A <- r[(1:i)]
B <- r[-(1:i)]
arrangements <- c(arrangements, apply(do.call(rbind, permn(1:length(items))), 1, function(z) list(z[A], z[B])))
}
Run Code Online (Sandbox Code Playgroud)
因为它返回集,都是平等的,即{这是相当无用1,2,3}和{ 2,1,3},并没有足够的灵活性来处理不同的价值观n.任何人有任何想法我怎么能这样做?谢谢.
有一套'套'包:
require(sets)
power_set(1:4)
sapply( set_power(1:4) , function(x) set_complement(x ,as.set(1:4)) )
list( Set_A = as.list(set_power(1:4)),
Set_B = sapply( set_power(1:4) , function(x) set_complement(x ,as.set(1:4)) ) )
Run Code Online (Sandbox Code Playgroud)
它包括像({1,2,3,4},{})这样的配对,从设定理论的角度来看是正确的,但你可能想要将它们消除为"退化".(现在很清楚,通过递归地对Set_B结果进行处理,可以将它推广到更大的N.)