PREGUNTA 1.

Después de ejecutar el siguiente for() usted tendrá 50 data frames llamados: df_1, df_2, df_3, …, df_50. Cada data frame tiene 2 columnas; la primera, es el identificador del vendedor; y la segunda, es las ventas que hizo en un día determinado.

for (i in 1:50) {
  set.seed(i)
  t<-data.frame(id=sample(1:520,500,F),
                ventas=sample(100:10000,500,T))
  
  names(t)[2]<-paste0("ventas_",i)
  assign(paste0("df_",i),t)
  rm(t)
}

Se le pide unir los 50 data frames en uno solo, el objetivo es tener la información solo de los que han realizado ventas los 50 días, es decir, solo se tiene que quedar con las personas que han realizado las ventas los 50 días. Por ejemplo, si una persona no realizó la venta en un día, ya no debería ser considerado en su data frame final.

Solución - pregunta 1 (5 puntos).

# Colocando los 50 data frames en una lista.
df_lis<-lapply(ls(pattern = "^df"), get)

# Juntando los 50 data frames en uno solo.
todo<-plyr::join_all(df_lis,type = "inner")

# Viendo el data frame.
library(dplyr)
todo<-todo %>% as_tibble() 
todo
## # A tibble: 76 x 51
##       id ventas_1 ventas_10 ventas_11 ventas_12 ventas_13 ventas_14 ventas_15
##    <int>    <int>     <int>     <int>     <int>     <int>     <int>     <int>
##  1   129     1946      9888      5717      5017      7197       175      4016
##  2   299     6472      7547      1796      7175      1099      6370      6991
##  3   187     9019      3410      4715       333      1521      1701      2811
##  4   485     1902      2603      1781      6279      5529      5063      5449
##  5   165     9705      5963      5218      6125      5848      1224      5241
##  6   382     6889      7787      8814      5295      5082      6369      7859
##  7   428     6724      8599      9688      3958      8111      4462      6751
##  8   519     3427      9809      7766      1257      6374      1479      8777
##  9    42     3225       838       507      2466       770      1483      6505
## 10   422     2293      2321      8965      7423      6545      1144      6389
## # ... with 66 more rows, and 43 more variables: ventas_16 <int>,
## #   ventas_17 <int>, ventas_18 <int>, ventas_19 <int>, ventas_2 <int>,
## #   ventas_20 <int>, ventas_21 <int>, ventas_22 <int>, ventas_23 <int>,
## #   ventas_24 <int>, ventas_25 <int>, ventas_26 <int>, ventas_27 <int>,
## #   ventas_28 <int>, ventas_29 <int>, ventas_3 <int>, ventas_30 <int>,
## #   ventas_31 <int>, ventas_32 <int>, ventas_33 <int>, ventas_34 <int>,
## #   ventas_35 <int>, ventas_36 <int>, ventas_37 <int>, ventas_38 <int>, ...

PREGUNTA 2.

De la pregunta anterior una vez que tiene su data frame final que contiene a los vendedores que han realizado ventas durante los 50 días consecutivos.

Se le pide calcular lo siguiente:

  1. Cuántos vendedores lograron ventas los 50 días.
  2. Cuánto fue la venta total de cada uno de estos vendedores durante los 50 días.
  3. Cuál es el “id” del vendedor con las mayores ventas.
  4. Calcular la venta promedio por cada día.
  5. Calcular las ventas de 10 días en 10 días, es decir, calcular las ventas totales del día 1 al día 10, luego las ventas totales del día 11 al 20 y así sucesivamente.

Solución - pregunta 2 (10 puntos).

# 1. Cuántos vendedores lograron ventas los 50 días. 
todo %>% count()
## # A tibble: 1 x 1
##       n
##   <int>
## 1    76
# 2. Cuánto fue la venta total de cada uno de estos vendedores durante los 50 días.
todo$VENTA_TOTAL<-apply(todo[,2:51], 1, sum)

todo %>% select(id, VENTA_TOTAL)
## # A tibble: 76 x 2
##       id VENTA_TOTAL
##    <int>       <int>
##  1   129      257204
##  2   299      294146
##  3   187      198415
##  4   485      250352
##  5   165      257758
##  6   382      281601
##  7   428      260639
##  8   519      203080
##  9    42      259847
## 10   422      288235
## # ... with 66 more rows
# Se logra el mismo resultado si se usa la función rowsums de R base.
todo$VENTA_TOTAL<-rowSums(todo[,2:51])

todo %>% select(id, VENTA_TOTAL)
## # A tibble: 76 x 2
##       id VENTA_TOTAL
##    <int>       <dbl>
##  1   129      257204
##  2   299      294146
##  3   187      198415
##  4   485      250352
##  5   165      257758
##  6   382      281601
##  7   428      260639
##  8   519      203080
##  9    42      259847
## 10   422      288235
## # ... with 66 more rows
# 3. Cuál es el "id" del vendedor con las mayores ventas.
todo %>% arrange(-VENTA_TOTAL) %>% select(id, VENTA_TOTAL) %>% head(1)
## # A tibble: 1 x 2
##      id VENTA_TOTAL
##   <int>       <dbl>
## 1   518      299568
# 4. Calcular la venta promedio por cada día. 
todo %>% select(-id,-VENTA_TOTAL) %>% summarise_all(list("vent_prom"=mean))
## # A tibble: 1 x 50
##   ventas_1_vent_prom ventas_10_vent_prom ventas_11_vent_prom ventas_12_vent_prom
##                <dbl>               <dbl>               <dbl>               <dbl>
## 1              5143.               5023.               5346.               4948.
## # ... with 46 more variables: ventas_13_vent_prom <dbl>,
## #   ventas_14_vent_prom <dbl>, ventas_15_vent_prom <dbl>,
## #   ventas_16_vent_prom <dbl>, ventas_17_vent_prom <dbl>,
## #   ventas_18_vent_prom <dbl>, ventas_19_vent_prom <dbl>,
## #   ventas_2_vent_prom <dbl>, ventas_20_vent_prom <dbl>,
## #   ventas_21_vent_prom <dbl>, ventas_22_vent_prom <dbl>,
## #   ventas_23_vent_prom <dbl>, ventas_24_vent_prom <dbl>, ...
# También puede salir con apply.
apply(todo[2:51], 2, mean)
##  ventas_1 ventas_10 ventas_11 ventas_12 ventas_13 ventas_14 ventas_15 ventas_16 
##  5142.842  5022.829  5345.671  4947.618  5039.224  4486.934  4862.671  5099.697 
## ventas_17 ventas_18 ventas_19  ventas_2 ventas_20 ventas_21 ventas_22 ventas_23 
##  4610.487  4909.711  5783.750  5356.434  5010.211  5137.566  4222.908  5320.658 
## ventas_24 ventas_25 ventas_26 ventas_27 ventas_28 ventas_29  ventas_3 ventas_30 
##  5279.039  4994.197  5292.684  4966.447  5567.882  5374.697  5359.500  4757.474 
## ventas_31 ventas_32 ventas_33 ventas_34 ventas_35 ventas_36 ventas_37 ventas_38 
##  4547.013  5076.368  5245.697  5402.382  4910.829  4693.526  5341.947  4891.408 
## ventas_39  ventas_4 ventas_40 ventas_41 ventas_42 ventas_43 ventas_44 ventas_45 
##  5098.132  4378.118  4719.605  5121.132  5195.276  5870.461  5239.434  5171.263 
## ventas_46 ventas_47 ventas_48 ventas_49  ventas_5 ventas_50  ventas_6  ventas_7 
##  5663.526  4743.987  6039.645  4718.026  5029.408  4344.408  5249.447  4946.697 
##  ventas_8  ventas_9 
##  5718.408  5032.671
# 5. Calcular las ventas de 10 días en 10 días, es decir, calcular las ventas totales
# del día 1 al día 10, luego las ventas totales del día 11 al 20 y así sucesivamente.

# Con dplyr - ordenando columnas.
# Primero hay que ordenar las variables para poder agruparlas, ya que estan desordenadas. 
todo %>% select(num_range("ventas_",1:50)) %>% 
  mutate(dias1_10=rowSums(select(.,1:10)),
                dias11_20=rowSums(select(.,11:20)),
                dias21_30=rowSums(select(.,21:30)),
                dias31_40=rowSums(select(.,31:40)),
                dias41_50=rowSums(select(.,41:50))) %>% 
    select(matches("^dias")) %>% summarise_all(list(sum))
## # A tibble: 1 x 5
##   dias1_10 dias11_20 dias21_30 dias31_40 dias41_50
##      <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
## 1  3893963   3807294   3869430   3794445   3960144
# Con sapply - ordenando columnas,
bb<-todo %>% select(num_range("ventas_",1:50))

l_bb<-list(bb[,1:10],bb[,11:20],bb[,21:30],bb[,31:40],bb[,41:50])

sapply(l_bb, sum)
## [1] 3893963 3807294 3869430 3794445 3960144
# Con dplyr - sin ordenar columnas.
todo %>% mutate(dias1_10=rowSums(select(.,matches("_[1-9]$|10$"))),
                dias11_20=rowSums(select(.,matches("_1[1-9]$|20$"))),
                dias21_30=rowSums(select(.,matches("_2[1-9]$|30$"))),
                dias31_40=rowSums(select(.,matches("_3[1-9]$|40$"))),
                dias41_50=rowSums(select(.,matches("_4[1-9]$|50$")))) %>% 
  select(matches("^dias")) %>% summarise_all(list(sum))
## # A tibble: 1 x 5
##   dias1_10 dias11_20 dias21_30 dias31_40 dias41_50
##      <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
## 1  3893963   3807294   3869430   3794445   3960144
# Con R base y dplyr - sin ordenar columnas.
todo$dias1_10<-rowSums(todo[,paste0("ventas_",1:10)])
todo$dias11_20<-rowSums(todo[,paste0("ventas_",11:20)])
todo$dias21_30<-rowSums(todo[,paste0("ventas_",21:30)])
todo$dias31_40<-rowSums(todo[,paste0("ventas_",31:40)])
todo$dias41_50<-rowSums(todo[,paste0("ventas_",41:50)])

todo %>% select(matches("^dias")) %>% summarise_all(list(sum))
## # A tibble: 1 x 5
##   dias1_10 dias11_20 dias21_30 dias31_40 dias41_50
##      <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
## 1  3893963   3807294   3869430   3794445   3960144

PREGUNTA 3.

Usted está consternado con la derrota del PSG a manos del débil Real Madrid, lamentablemente usted no pudo ver el partido, así que solo le toca leer el minuto a minuto del partido. Para esto acude a la página del comercio. La scrapea corriendo el siguiente código.

library(rvest)
library(dplyr)

pg<-read_html("https://elcomercio.pe/deporte-total/futbol-mundial/real-madrid-psg-en-directo-gratis-ver-online-partido-de-vuelta-uefa-champions-league-2022-noticias-minuto-a-minuto-transmision-alineaciones-y-entradas-para-santiago-bernabeu-rmmd-dtbn-lbposting-espana-es-mx-cdmx-ar-noticia/")

mm<-pg %>% html_nodes("div.live-event2-comment") %>% html_text()

Una vez que ha terminado de correr los siguientes códigos usted tiene un vector llamado mm el cual contiene el minuto a minuto del partido. Usted puede observar que el vector mm está un poco sucio, por lo cual desea crear un data frame con esta información, en donde, la primera columna sea la hora en la que se dio el mensaje y en otra columna el mensaje del minuto a minuto. Su data frame solo debe contener información desde que empezó el partido, es decir, desde 15:01 en adelante.

Tendrá que aplicar todos sus conocimientos de manipulación de caracteres y expresiones regulares para obtener el resultado siguiente. Es decir, tendrá que crear un data frame similar al que se muestra a continuación.

Solución - pregunta 3 (5 puntos).

# Separando el tiempo.
tiempo<-gsub("(\\d{2}:\\d{2})(.*)","\\1",mm)

# Dando formato al contenido de los mensajes.
mm<-gsub("\\d{2}:\\d{2}.* \t","",mm) # Quitando el tiempo.
mm<-gsub("\n"," ",mm) # Lo que es \n se convierte en espacio.
mm<-gsub("\\s+"," ",mm) # Uno o más espacios en un solo espacio. 
mm<-gsub("^\\s+|\\s+$","",mm) # Quitando espacios al inicio y final.

# Creando el data frame 
df<-data.frame(hora=tiempo,
               suceso=mm) 

# Solo desde el minuto 15:01 en adelante.
df<-df[1:42,]