将未知长度的序列拆分为R中的一定数量的集合

Fis*_*ist 5 r

我有一个长度不一的序列,例如:

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.任何人有任何想法我怎么能这样做?谢谢.

42-*_*42- 5

有一套'套'包:

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.)