5

長さが異なるシーケンスがあります。たとえば、次のようなものです。

items <- 1:4

nセット数の可能な組み合わせごとに分割したい。つまりn、2つです。私は戻りたいです:

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

セット内の配置は重要ではありません。つまり、セット { 1, 2, } は { , , 3} と同じです。セットを空にすることはできません。213

私が思いつくことができる最高のものは(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

'sets'パッケージがあります:

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 に答える