2012-07-02 21 views
5

Tengo una secuencia que varía en longitud, p. algo así como:División de una secuencia de longitud desconocida en un cierto número de conjuntos en R

items <- 1:4 

quiero dividirlo en todas las combinaciones posibles de n número de conjuntos. Así dicen n es dos, quiero volver:

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

etc. La disposición dentro de conjuntos no importa es decir, el conjunto {1, 2, 3} es el mismo que {2, 1, 3}. Los conjuntos no pueden estar vacíos.

mejor que pude llegar a (usando permn del paquete combinat) es:

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

que es bastante inútil porque devuelve conjuntos que son iguales, es decir {1, 2, 3} y {2, 1, 3} y no es lo suficientemente flexible como para manejar valores diferentes de n. Alguien tiene alguna idea de cómo puedo hacer esto? Gracias.

Respuesta

5

Hay un paquete 'conjuntos':

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

Incluye emparejamientos como ({1,2,3,4}, {}) que es correcto desde un punto de vista la teoría de conjuntos, pero es posible que desee para eliminarlos como "degenerados". (. El camino es claro ahora generalizar esto a mayor N, trabajando de forma recursiva en el resultado Set_B)

1

Aquí es otro camino, que te pueden ayudar:

# 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]) 
Cuestiones relacionadas