Skip to content

[R-es] Depuración de código

3 messages · Clei Y, Isidro Hidalgo, Carlos J. Gil Bellosta

#
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 ###
## 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
#
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 ###
## 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
#
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ó: