[R-es] Combinaciones sin repetición...con restricciones
giltrapo
giltrapo en gmail.com
Jue Abr 28 20:37:09 CEST 2016
Hola, Carlos.
Primero, muchas gracias por el código. No es exactamente lo que quería,
porque la parte "Detección de presencia de "cual_1" y "cual_2"... no
excluye aquellas combinaciones en las que está presente también el objeto
c, pero me ha servido de base e inspiración para elaborar otro código.
He copiado la primera parte de tu función, para crear todas las
combinaciones que necesite en un momento determinado, y le he agregado un
par de parámetros para decidir el rango del orden de las combinaciones (por
ejemplo, todas las combinaciones de los 7 objetos, desde el orden 2 al 4).
También he preferido guardar todas las combinaciones en un data frame,
porque mi objetivo último sería poder asignar cada uno de los objetos que
estoy combinando a una variable concreta. Por ejemplo, la V1 es siempre el
Objeto 1 (a), la V2 es siempre el Objeto 2 (a,b), y así sucesivamente con
todos los objetos. De momento no lo he logrado, pero seguiré intentándolo.
my_choice <- function(conjunto, minimo, maximo) {
ele_ment <- conjunto
all_comb <- as.data.frame(matrix(data = NA, 0, maximo))
for (i in minimo:maximo) {
com_tmp <- as.data.frame(t(combn(
c("a", "b", "c", "a,b", "a,c", "b,c", "a,b,c"),i)))
all_comb <- merge(all_comb, com_tmp, all.x = TRUE, all.y =
TRUE)
}
return(all_comb)
}
Con esta función he obtenido todas las combinaciones que necesito. Por
ejemplo, volviendo a mi ejemplo del principio, si quisiera obtener todas
las combinaciones posibles de los 7 objetos, desde el rango 1 al 7:
datos <- c("a", "b", "c", "a,b", "a,c", "b,c", "a,b,c")
df <- my_choice(datos, 1, 7)
Ahora ya tengo un data frame con las 127 combinaciones posibles de los 7
objetos.
El filtro del data frame lo hago con apply y grepl (lo intenté con
str_detect, pero me daba problemas con las filas que tenían NA)
Ejemplo: combinaciones que tengan los elementos a y b, pero no c
df[apply(df, 1, function(x) any(grepl("a", x)) & any(grepl("b", x)) &
all(!grepl("c", x))),]
Ejemplo: combinaciones que tengan los elementos a, b y c
df[apply(df, 1, function(x) any(grepl("a", x)) & any(grepl("b", x)) &
any(grepl("c", x))),]
Muchas gracias de nuevo por la ayuda, Carlos, y un fuerte saludo!
Jose Ignacio
2016-04-27 23:34 GMT+02:00 Carlos Ortega <cof en qualityexcellence.es>:
> Hola,
>
> Esta es una forma de hacerlo,
>
> #-----------------------
> library(stringr)
> my_choice <- function(conjunto, cual_1, cual_2) {
>
> #Todas combinaciones cogidas de 1, 2, ... n (número elementos de
> "conjunto")
> ele_ment <- conjunto
> all_comb <- vector()
> for (i in 1:length(ele_ment)) {
> com_tmp <- combn(ele_ment, i, FUN=str_c, simplify = TRUE, collapse="_")
> all_comb <- c(all_comb, com_tmp)
> }
>
> #Detección de presencia de "cual_1" y "cual_2" en el conjunto...
> cu_al <- paste(cual_1,cual_2,sep="|")
> res_out <- all_comb[str_detect(all_comb, cu_al)]
> return(res_out)
> }
> #-----------------------
>
> Ejemplo:
>
> > set_examp <- c('a','b','c','d')
> > my_choice(set_examp, 'a', 'b')
> [1] "a" "b" "a_b" "a_c" "a_d" "b_c" "b_d"
> "a_b_c"
> [9] "a_b_d" "a_c_d" "b_c_d" "a_b_c_d"
>
> La función calcula todas las combinaciones sin repetición posibles y
> extrae los elementos donde están presentes "cual_1" y "cual_2". No está
> preparada para que pueda funcionar con un sólo "cual", pero solucionarlo no
> es demasiado complejo.... así no tendrás que usar Excel para esto...
>
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es
>
>
> El 27 de abril de 2016, 17:48, giltrapo <giltrapo en gmail.com> escribió:
>
>> Hola, tengo que resolver un problema para el que normalmente utilizaría
>> excel, pero me gustaría intentar resolverlo con R. Se trata de lo
>> siguiente:
>>
>> Tengo tres elementos: a, b y c.
>>
>> Dichos elementos están agrupados en siete objetos, producto de todas las
>> combinaciones sin repetición posibles:
>>
>> Objeto 1: a
>> Objeto 2: b
>> Objeto 3: c
>> Objeto 4: a y b
>> Objeto 5: a y c
>> Objeto 6: b y c
>> Objeto 7: a, b y c
>>
>> Mi objetivo es obtener todas las combinaciones sin repetición posibles de
>> orden n, en las que estén presentes, única y exclusivamente, los elementos
>> que yo elija.
>>
>> Ejemplo 1: ¿en cuántas combinaciones sin repetición de los objetos
>> anteriores, tomados de dos en dos, están presentes los elementos a y b
>> (SÓLO a y b)?
>>
>> Solución:
>> (Objeto 1, Objeto 2)
>> (Objeto 1, Objeto 4)
>> (Objeto 2, Objeto 4).
>>
>> Un paso más allá consistiría en obtener todas las combinaciones sin
>> repetición posibles de cualquier orden, en las que estén presentes, única
>> y
>> exclusivamente, los elemento que yo elija.
>>
>> Ejemplo 2: ¿en cuántas combinaciones sin repetición de cualquier orden de
>> los objetos anteriores están presentes los elementos a y b (SÓLO a y b)?
>>
>> Solución:
>> (Objeto 4)
>> (Objeto 1, Objeto 2)
>> (Objeto 1, Objeto 4)
>> (Objeto 2, Objeto 4)
>> (Objeto 1, Objeto 2, Objeto 4)
>>
>> Para hacerlo en R me planteé el primer ejemplo: ¿en cuántas combinaciones
>> sin repetición de los objetos anteriores, tomados de dos en dos, están
>> presentes los elementos a y b (SÓLO a y b)?
>>
>> df <- as.data.frame(t(combn(c("a", "b", "c", "a,b", "a,c", "b,c",
>> "a,b,c"),2)))
>> df <- df[!grepl("c", df$V1),]
>> df <- df[!grepl("c", df$V2),]
>>
>> El problema es que este código me resuelve este caso concreto, pero no
>> otros similares. He intentado crear una función que me permita resolver
>> otro casos, como por ejemplo el ejemplo 2, pero no doy con la forma
>> adecuada de plantearlo.
>>
>> ¿Se os ocurre alguna forma?
>>
>> Muchas gracias!
>>
>> Jose Ignacio
>>
>> [[alternative HTML version deleted]]
>>
>> _______________________________________________
>> R-help-es mailing list
>> R-help-es en r-project.org
>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>>
>
>
>
> --
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es
>
[[alternative HTML version deleted]]
Más información sobre la lista de distribución R-help-es