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]]
Javier Marcuzzi
2016-Apr-27 18:51 UTC
[R-es] Combinaciones sin repetición...con restricciones
Estimado
No comprendo que desea, por ejemplo en su ejemplo 1, valga la redundancia, dice
solución Objeto 1, Objeto 2, a la pegunta de, están presentes a y b, pero el
objeto uno y como el dos solo tienen un elemento, no un par, la condición SOLO A
y B, está en el objeto 4.
Creo que usted descarta el elemento C, no analiza las combinaciónes.
Javier Rubén Marcuzzi
De: giltrapo
Enviado: miércoles, 27 de abril de 2016 12:49
Para: r-help-es en r-project.org
Asunto: [R-es] Combinaciones sin repetición...con restricciones
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
[[alternative HTML version deleted]]
Carlos Ortega
2016-Apr-27 21:34 UTC
[R-es] Combinaciones sin repetición...con restricciones
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]]
Hola, Javier. La solución Objeto 1 (a) y Objeto 2 (b) cumple con la condición que puse, es decir, que estén presentes los objetos a y b, pero no el c. Asimismo, la solución Objeto 1 (a) y Objeto 4 (a y b), también cumple con esa condición. El objeto a está repetido dos veces, pero da igual, no es condicionante. Lo único que me interesa es que estén presentes los objetos a y b en la combinación. Estoy totalmente de acuerdo contigo en que el filtro que hecho, descartando el elemento c, no es correcto. En este caso concreto ha salido bien, pero de pura chiripa. Precisamente el motivo de mi mail era ver si podíais ayudarme a resolver este problema. Muchas gracias por contestar y saludos! Jose Ignacio 2016-04-27 20:51 GMT+02:00 Javier Marcuzzi <javier.ruben.marcuzzi en gmail.com> :> Estimado > > > > No comprendo que desea, por ejemplo en su ejemplo 1, valga la redundancia, > dice solución Objeto 1, Objeto 2, a la pegunta de, están presentes a y b, > pero el objeto uno y como el dos solo tienen un elemento, no un par, la > condición SOLO A y B, está en el objeto 4. > > > > Creo que usted descarta el elemento C, no analiza las combinaciónes. > > > > Javier Rubén Marcuzzi > > > > *De: *giltrapo <giltrapo en gmail.com> > *Enviado: *miércoles, 27 de abril de 2016 12:49 > *Para: *r-help-es en r-project.org > *Asunto: *[R-es] Combinaciones sin repetición...con restricciones > > > > 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 > > >[[alternative HTML version deleted]]
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]]