2012-07-02 13 views
5

Mam sekwencję, która ma różną długość, np. coś takiego:Dzielenie sekwencji nieznanej długości na określoną liczbę zestawów w R

items <- 1:4 

Chcę podzielić ją na każdej możliwej kombinacji n liczby zestawów. Tak mówią n wynosi dwa, chcę wrócić:

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

itd. Układ wewnątrz zestawów nie ma znaczenia, to znaczy zbioru {1, 2, 3} jest taka sama jak {2, 1, 3}. Zestawy nie mogą być puste.

Najlepszy mogłem wymyślić (używając permn z pakietu combinat) wynosi:

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

Która jest dość bezużyteczne, ponieważ zwraca zestawy, które są równe tzn {1, 2, 3} i {2, 1, 3} i nie jest wystarczająco elastyczny, aby obsłużyć różne wartości: n. Ktoś ma jakieś pomysły, jak mogę to zrobić? Dzięki.

Odpowiedz

5

Jest „zestawy” pakiet:

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

Obejmuje ona powiązania podobne ({1,2,3,4}, {}), która jest poprawna z punktu widzenia teorii mnogości, ale może chcesz aby wyeliminować je jako "zdegenerowane". (. Droga jest teraz jasne uogólnić to do większej N przez pracę rekurencyjnie na wynik Set_B)

1

Oto inny sposób, który może pomóc:

# 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]) 
Powiązane problemy