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