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.
# 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>, ...
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.
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
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.
# 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,]