Hola a todos Empleando mis limitados conocimientos de R pude resolver un ejercicio elaborando un c?digo, estoy seguro que se puede simplificar, si alguien tiene alg?n tiempo libre agradecer?a me pudiera ayudar depurando el c?digo, lo adjunto junto con unas tablas que representan el inicio y final. El ejercicio consiste en calcular la cantidad ideal de los Productos A y B, considerando su precio, el l?mite presupuestario y la utilidad que representan. Saludos. ### Creamos data_frame de cantidad y utilidad ### P1 <- data.frame( "Cantidad"= 0:10, "UtilidadA" = c("0","15","28","35","40","45","49","53","55","56","56"), "UtilidadB" = c("0","17","30","37","42","47","51","55","57","58","58")) Q UtilidadA UtilidadB 0 0 0 1 15 17 2 28 30 3 35 37 4 40 42 5 45 47 6 49 51 7 53 55 8 55 57 9 56 58 10 56 58 ### Creamos variables de precio y l?mite presupuestario ### PrecioA <- 12 PrecioB <- 16 L_prep <- 90 ### cambiamos clase ### P1$UtilidadA <- as.numeric(P1$UtilidadA) P1$UtilidadB <- as.numeric(P1$UtilidadB) ### Creamos vector de gasto en producto A ### Gasto_PA <- numeric(length(P1$Cantidad)) for(i in 1:length(P1$Cantidad)){ Gasto_PA[i] <- round((P1$Cantidad[i] *PrecioA),digits = 0) } ### Creamos vector de unidades B con relaci?n a A ### CestaB <- numeric(length(Gasto_PA)) for (i in 1:length(Gasto_PA)) { CestaB[i] <- round(((L_prep-Gasto_PA[i])/PrecioB),digits = 0) } ### Creamos vector de utilidad total ### library(dplyr) ## Del primer data frame obtenemos cantidad y utilidad de B ###> P2 <- data.frame(P1$Cantidad, P1$UtilidadB)## Del primer data frame obtenemos cantidad y utilidad de A ### p3 <- select(P1,Cantidad,UtilidadA) ## Cambiamos nombre de columnas y tipo para unir data_frame ## CestaB <- data.frame(CestaB) colnames(CestaB)[1] <- "P1.Cantidad" ## Unimos Unidades de B con su utilidad manteniendo el orden ## P4 <- merge.data.frame(x=CestaB, y=P2, all.x = TRUE, sort = F) ## Unimos data frame de cantidad y utilidad de A con cantidad y utilidad de B ## P5 <- cbind(p3,P4) ## Renombramos columnas ## colnames(P5)[1] <- "CantidadA" colnames(P5)[3] <- "CantidadB" colnames(P5)[4] <- "UtilidadB" ## Creamos columna de utilidad total ## ## Este data frame muestra las combinaciones de A y B que se pueden adquirir con el l?mite presupuestario y la utilidad## P5$Utilidad_Total <- P5$UtilidadA+P5$UtilidadB CantidadA UtilidadA CantidadB UtilidadB Utilidad_Total 0 0 5 47 47 1 15 4 42 57 2 28 4 42 70 3 35 3 37 72 4 40 2 30 70 5 45 1 17 62 6 49 1 17 66 7 53 0 0 53 8 55 0 0 55 9 56 -1 NA NA 10 56 -1 NA NA ## Identificamos utilidad total m?xima ## utilidad_max <- which.max(P5$Utilidad_Total) ## Creamos data frame con combinaci?n de A y B que entrega utilidad m?xima ## fila_max <- P5[utilidad_max, ] print(fila_max) class(fila_max) ## Este data frame ser?a la salida en ShinyApp ## Gracias y saludos Cleiver Yam [[alternative HTML version deleted]]
Hola, Esto podría simplificar un poco la parte inicial: # Creamos data_frame de cantidad y utilidad P1 <- data.frame( Cantidad= 0:10, UtilidadA = c(0,15,28,35,40,45,49,53,55,56,56), UtilidadB = c(0,17,30,37,42,47,51,55,57,58,58) ) # No uses comillas y cárgalos directamente como numéricos # Creamos variables de precio y límite presupuestario PrecioA <- 12 PrecioB <- 16 L_prep <- 90 # cambiamos clase # Te lo ahorras porque ya los has cargado como numéricos # Creamos vector de gasto en producto A # R trabaja vectorialmente, no necesitas un bucle Gasto_PA <- round((P1$Cantidad * PrecioA), digits = 0) # Creamos vector de unidades B con relación a A CestaB <- floor((L_prep-Gasto_PA)/PrecioB) # Lo mismo # Por otro lado, usa floor(), para que te coja el valor entero por abajo, asegurándote de que no vas a exceder el presupuesto El resto, salvo alguna cosa sin importancia, tiene sentido como lo haces... Un saludo, Isidro Hidalgo Arellano Observatorio del Mercado de Trabajo Junta de Comunidades de Castilla ? La Mancha -----Mensaje original----- De: R-help-es <r-help-es-bounces en r-project.org> En nombre de Clei Y Enviado el: miércoles, 7 de febrero de 2024 2:28 Para: R-help-es en r-project.org Asunto: [R-es] Depuración de código Hola a todos Empleando mis limitados conocimientos de R pude resolver un ejercicio elaborando un c?digo, estoy seguro que se puede simplificar, si alguien tiene alg?n tiempo libre agradecer?a me pudiera ayudar depurando el c?digo, lo adjunto junto con unas tablas que representan el inicio y final. El ejercicio consiste en calcular la cantidad ideal de los Productos A y B, considerando su precio, el l?mite presupuestario y la utilidad que representan. Saludos. ### Creamos data_frame de cantidad y utilidad ### P1 <- data.frame( "Cantidad"= 0:10, "UtilidadA" = c("0","15","28","35","40","45","49","53","55","56","56"), "UtilidadB" = c("0","17","30","37","42","47","51","55","57","58","58")) Q UtilidadA UtilidadB 0 0 0 1 15 17 2 28 30 3 35 37 4 40 42 5 45 47 6 49 51 7 53 55 8 55 57 9 56 58 10 56 58 ### Creamos variables de precio y l?mite presupuestario ### PrecioA <- 12 PrecioB <- 16 L_prep <- 90 ### cambiamos clase ### P1$UtilidadA <- as.numeric(P1$UtilidadA) P1$UtilidadB <- as.numeric(P1$UtilidadB) ### Creamos vector de gasto en producto A ### Gasto_PA <- numeric(length(P1$Cantidad)) for(i in 1:length(P1$Cantidad)){ Gasto_PA[i] <- round((P1$Cantidad[i] *PrecioA),digits = 0) } ### Creamos vector de unidades B con relaci?n a A ### CestaB <- numeric(length(Gasto_PA)) for (i in 1:length(Gasto_PA)) { CestaB[i] <- round(((L_prep-Gasto_PA[i])/PrecioB),digits = 0) } ### Creamos vector de utilidad total ### library(dplyr) ## Del primer data frame obtenemos cantidad y utilidad de B ###> P2 <- data.frame(P1$Cantidad, P1$UtilidadB)## Del primer data frame obtenemos cantidad y utilidad de A ### p3 <- select(P1,Cantidad,UtilidadA) ## Cambiamos nombre de columnas y tipo para unir data_frame ## CestaB <- data.frame(CestaB) colnames(CestaB)[1] <- "P1.Cantidad" ## Unimos Unidades de B con su utilidad manteniendo el orden ## P4 <- merge.data.frame(x=CestaB, y=P2, all.x = TRUE, sort = F) ## Unimos data frame de cantidad y utilidad de A con cantidad y utilidad de B ## P5 <- cbind(p3,P4) ## Renombramos columnas ## colnames(P5)[1] <- "CantidadA" colnames(P5)[3] <- "CantidadB" colnames(P5)[4] <- "UtilidadB" ## Creamos columna de utilidad total ## ## Este data frame muestra las combinaciones de A y B que se pueden adquirir con el l?mite presupuestario y la utilidad## P5$Utilidad_Total <- P5$UtilidadA+P5$UtilidadB CantidadA UtilidadA CantidadB UtilidadB Utilidad_Total 0 0 5 47 47 1 15 4 42 57 2 28 4 42 70 3 35 3 37 72 4 40 2 30 70 5 45 1 17 62 6 49 1 17 66 7 53 0 0 53 8 55 0 0 55 9 56 -1 NA NA 10 56 -1 NA NA ## Identificamos utilidad total m?xima ## utilidad_max <- which.max(P5$Utilidad_Total) ## Creamos data frame con combinaci?n de A y B que entrega utilidad m?xima ## fila_max <- P5[utilidad_max, ] print(fila_max) class(fila_max) ## Este data frame ser?a la salida en ShinyApp ## Gracias y saludos Cleiver Yam [[alternative HTML version deleted]]
Prueba algo así: ############## P1 <- data.frame( Cantidad = 0:10, UtilidadA = c(0,15,28,35,40,45,49,53,55,56,56), UtilidadB = c(0,17,30,37,42,47,51,55,57,58,58) ) PrecioA <- 12 PrecioB <- 16 L_prep <- 90 out <- expand.grid(cant_a = 0:10, cant_b = 0:10) out <- merge(out, P1[, c("Cantidad", "UtilidadA")], by.x = "cant_a", by.y"Cantidad") out <- merge(out, P1[, c("Cantidad", "UtilidadB")], by.x = "cant_b", by.y"Cantidad") out$utilidad <- out$UtilidadA + out$UtilidadB out$precio <- out$cant_a * PrecioA + out$cant_b * PrecioB out <- out[out$precio <= L_prep,] out <- out[order(out$utilidad),] tail(out, 1) ############## Se puede hacer mejor, pero es lo suficientemente bueno. Un saludo, Carlos J. Gil Bellosta http://www.datanalytics.com El mié, 7 feb 2024 a las 2:28, Clei Y (<cleiver_yam en hotmail.com>) escribió:> Hola a todos > > Empleando mis limitados conocimientos de R pude resolver un ejercicio > elaborando un código, estoy seguro que se puede simplificar, si alguien > tiene algún tiempo libre agradecería me pudiera ayudar depurando el código, > lo adjunto junto con unas tablas que representan el inicio y final. > > El ejercicio consiste en calcular la cantidad ideal de los Productos A y > B, considerando su precio, el límite presupuestario y la utilidad que > representan. > > Saludos. > > > ### Creamos data_frame de cantidad y utilidad ### > > P1 <- data.frame( > > "Cantidad"= 0:10, > > "UtilidadA" = c("0","15","28","35","40","45","49","53","55","56","56"), > > "UtilidadB" = c("0","17","30","37","42","47","51","55","57","58","58")) > > Q > UtilidadA > UtilidadB > 0 > 0 > 0 > 1 > 15 > 17 > 2 > 28 > 30 > 3 > 35 > 37 > 4 > 40 > 42 > 5 > 45 > 47 > 6 > 49 > 51 > 7 > 53 > 55 > 8 > 55 > 57 > 9 > 56 > 58 > 10 > 56 > 58 > > > > > ### Creamos variables de precio y límite presupuestario ### > > PrecioA <- 12 > > PrecioB <- 16 > > L_prep <- 90 > > > > ### cambiamos clase ### > > P1$UtilidadA <- as.numeric(P1$UtilidadA) > > P1$UtilidadB <- as.numeric(P1$UtilidadB) > > > > ### Creamos vector de gasto en producto A ### > > Gasto_PA <- numeric(length(P1$Cantidad)) > > for(i in 1:length(P1$Cantidad)){ > > Gasto_PA[i] <- round((P1$Cantidad[i] *PrecioA),digits = 0) > > } > > > > ### Creamos vector de unidades B con relación a A ### > > CestaB <- numeric(length(Gasto_PA)) > > for (i in 1:length(Gasto_PA)) { > > CestaB[i] <- round(((L_prep-Gasto_PA[i])/PrecioB),digits = 0) > > } > > > > ### Creamos vector de utilidad total ### > > library(dplyr) > > > > ## Del primer data frame obtenemos cantidad y utilidad de B ### > > > P2 <- data.frame(P1$Cantidad, P1$UtilidadB) > > > > ## Del primer data frame obtenemos cantidad y utilidad de A ### > > p3 <- select(P1,Cantidad,UtilidadA) > > > > ## Cambiamos nombre de columnas y tipo para unir data_frame ## > > CestaB <- data.frame(CestaB) > > colnames(CestaB)[1] <- "P1.Cantidad" > > > > ## Unimos Unidades de B con su utilidad manteniendo el orden ## > > P4 <- merge.data.frame(x=CestaB, y=P2, all.x = TRUE, sort = F) > > > > ## Unimos data frame de cantidad y utilidad de A con cantidad y utilidad > de B ## > > P5 <- cbind(p3,P4) > > > > ## Renombramos columnas ## > > colnames(P5)[1] <- "CantidadA" > > colnames(P5)[3] <- "CantidadB" > > colnames(P5)[4] <- "UtilidadB" > > > > ## Creamos columna de utilidad total ## > > ## Este data frame muestra las combinaciones de A y B que se pueden > adquirir con el límite presupuestario y la utilidad## > > P5$Utilidad_Total <- P5$UtilidadA+P5$UtilidadB > > CantidadA > UtilidadA > CantidadB > UtilidadB > Utilidad_Total > 0 > 0 > 5 > 47 > 47 > 1 > 15 > 4 > 42 > 57 > 2 > 28 > 4 > 42 > 70 > 3 > 35 > 3 > 37 > 72 > 4 > 40 > 2 > 30 > 70 > 5 > 45 > 1 > 17 > 62 > 6 > 49 > 1 > 17 > 66 > 7 > 53 > 0 > 0 > 53 > 8 > 55 > 0 > 0 > 55 > 9 > 56 > -1 > NA > NA > 10 > 56 > -1 > NA > NA > > > > ## Identificamos utilidad total máxima ## > > utilidad_max <- which.max(P5$Utilidad_Total) > > > > ## Creamos data frame con combinación de A y B que entrega utilidad máxima > ## > > fila_max <- P5[utilidad_max, ] > > print(fila_max) > > class(fila_max) > > ## Este data frame sería la salida en ShinyApp ## > > > Gracias y saludos > > Cleiver Yam > > [[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]]