2012-07-02 7 views
5

私は長さが変化するシーケンスを持っています。以下のようなもの:未知の長さのシーケンスを特定の数のセットに分割するR

items <- 1:4 

私はセットのn数のすべての組み合わせに分割します。

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

など即ち、集合{123}重要ではありませんセット内の配置は、{213}と同じです。だから私は返すようにしたい、nが2であると言います。セットは空にすることはできません。ベスト

私は(パッケージcombinatからpermnを使用して)を考え出すことができことである:それはすなわち等しいセットを返すので、かなり無用である

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

{123}と{21,3}であり、異なる値のnを処理するのに十分なほど柔軟ではありません。誰でも私がこれをどうやってできるか考えている?ありがとう。

答えて

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}、{})のようなペアが含まれて集合論の観点から正しいですが、あなたが望むことそれらを "縮退"として排除する。ここで

1

(。今Set_B結果に再帰的に働くことによって、より大きなNにこれを一般化する明確な方法は)あなたを助けるかもしれない他の方法で、次のとおりです。

# 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]) 
関連する問題