5

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

items <- 1:4

我想把它分成每组可能的组合n。所以说n是两个,我想返回:

Set A    Set B
-----    -----
1        2 3 4
1 2      3 4
1 2 3    4
1 3      2 4 

等等。集合内的排列并不重要,即集合 { 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])))
}

这是相当无用的,因为它返回相等的集合,即 { 1, 2, 3} 和 { 2, 1, 3} 并且不够灵活以处理n. 有人知道我该怎么做吗?谢谢。

4

2 回答 2

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

它包括像 ( {1,2,3,4}, {} ) 这样的配对,从集合论的角度来看这是正确的,但您可能希望将它们消除为“退化”。(现在通过递归处理 Set_B 结果将其推广到更大的 N 的方法很清楚。)

于 2012-07-02T16:26:33.740 回答
1

这是另一种方式,可能会对您有所帮助:

# Params
n <- 2
items <- 1:4

# Sample
l <- lapply(items, function(x) combn(items, x, simplify=F))
l <-unlist(l, recursive=F)

# devide into sets
tmp <- 1:length(l)
tmp <- split(tmp, sample(1:n, length(l), replace=T))

sets <- lapply(tmp, function(x) l[x])
于 2012-07-02T16:36:04.530 回答