EJERCICIO 1

Para este ejercicio he propuesto tres soluciones (siempre me ha gustado la combinatoria), una que debe ser mejor computacionalmente, tratando cada matrícula como texto, otra que es más matemática, tratándolas como números y una final enfocada en las combinaciones, y optimizar el problema.

veintes <- 0
for(i in c(0:9999)){
  A = c(0,3)
  A[1:4] <- as.numeric(substring(as.character(i), first=c(1:4), last=c(1:4)))
  if (sum(A[!is.na(A)]) == 20){
    veintes = veintes + 1
  }
}
solucion <- veintes/10000
cat("Suman veinte un:", solucion*100, "% de las matrículas")
## Suman veinte un: 6.33 % de las matrículas
veintes <- 0
for(i in c(0:9999)){
  A1 <- i%/%1000
  A2 <- (i-A1*1000)%/%100
  A3 <- (i-A1*1000-A2*100)%/%10
  A4 <- (i-A1*1000-A2*100-A3*10)
  if (A1 + A2 + A3 + A4 == 20){
    veintes = veintes + 1
  }
}
solucion <- veintes/10000
cat("Suman veinte un:", solucion*100, "% de las matrículas")
## Suman veinte un: 6.33 % de las matrículas
library(gtools)
veintes <- 0
for(i in c(0:9)){
  for(j in c(i:9)){
    for(k in c(j:9)){
      for(l in c(k:9)){
        if(i+j+k+l == 20){
          veintes <- veintes + nrow(unique(permutations(4,4,v=c(i,j,k,l),set=F)))
        }
      }
    }
  }
}
solucion <- veintes/10000
cat("Suman veinte un:", solucion*100, "% de las matrículas")
## Suman veinte un: 6.33 % de las matrículas

EJERCICIO 2

Este ejercicio para la versión .html he eliminado la línea en la que se mete el valor del lado del marco a través del prompt (ya que aún soy un novato con Markdown). En el fichero .R puede verse la línea que te pide que ingreses un entero mediante el prompt.

A <- 8L
marco <- matrix(nrow=A, ncol=A)
for (i in c(1:A)){
  if(i == 1 || i== A){
    marco[i,] <- rep("*", A) 
  }else{
    marco[i,] <- c(c('*'),rep('',A-2),c('*'))
  }
}
show(marco)
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## [1,] "*"  "*"  "*"  "*"  "*"  "*"  "*"  "*" 
## [2,] "*"  ""   ""   ""   ""   ""   ""   "*" 
## [3,] "*"  ""   ""   ""   ""   ""   ""   "*" 
## [4,] "*"  ""   ""   ""   ""   ""   ""   "*" 
## [5,] "*"  ""   ""   ""   ""   ""   ""   "*" 
## [6,] "*"  ""   ""   ""   ""   ""   ""   "*" 
## [7,] "*"  ""   ""   ""   ""   ""   ""   "*" 
## [8,] "*"  "*"  "*"  "*"  "*"  "*"  "*"  "*"

EJECICIO 3

Este ejercicio creo que pretendía que demostrásemos la capacidad de realizar varios plots e irlos superponiendo, así que he intentado presentar un plot lo más similar posible al que se nos mostraba.

library(readr)
delitos <- read_delim("delitos.txt", "\t", escape_double = FALSE, trim_ws = TRUE)
## Parsed with column specification:
## cols(
##   `1980` = col_double(),
##   `1990` = col_double(),
##   `1991` = col_double(),
##   `1992` = col_double(),
##   `1993` = col_double(),
##   `1994` = col_double()
## )
datos <- delitos[c(1:24),]
colors <- c('black', 'red', 'green', 'dark blue', 'blue', 'violet')
plot(c(1:nrow(datos)), datos$`1980`, type="l", xlab="Mediciones",
     ylab="Número de casos", ylim=c(0,450), main="Delitos por año"
     )
counter <- 2
for (col in colnames(datos)[2:length(datos)]){
  points(c(1:nrow(datos)), datos[[col]], type="l", col=colors[counter], lty=counter)
  counter <- counter +1
}
legend("topright", colnames(datos), lty=1:5, col=colors, cex=0.7)

coefs <- c(1:length(datos))
i <- 1
varcoef <- function(datos){
  sqrt(var(datos, na.rm=T))/mean(datos, na.rm=T)
}
for (col in colnames(datos)){
  coefs[i] <- varcoef(datos[[col]])
  i <- i +1
}
solucion <- colnames(datos)[which(coefs == min(coefs))]
cat("El año más homogéneo es:", solucion)
## El año más homogéneo es: 1980

EJERCICIO 4

Para este ejercicio he usado un dataframe como salida ya que me parecía la forma más elegante y ordenada de presentar las soluciones.

meanstdsimBYcols <- function(datos){
  Medias <- c(1:ncol(datos))
  Stds <- c(1:ncol(datos))
  ASs <- c(1:ncol(datos))
  i <- 1
  for (col in colnames(datos)){
    datarray <- datos[[col]][which(!is.na(datos[[col]]))]
    Medias[i] <- mean(datarray)
    Stds[i] <- sqrt(var(datarray))
    ASs[i] <- (sum((datarray - Medias[i])^3)/length(datarray))/(Stds[i]^3)
    i <- i +1
  }
  data.frame(
    media = Medias,
    std_desv = Stds,
    simetria = ASs,
    row.names = colnames(datos)
  )
}
datos <- data.frame(
  Progr1 = c(1.3, 2.2, 1.8, 3.9),
  Progr2 = c(1.6, 2.4, 1.7, 4.4),
  Progr3 = c(0.5, 0.4, 0.6, 2.0),
  Progr4 = c(1.2, 2.0, 1.5, 4.1),
  Progr5 = c(1.1, 1.8, 1.3, 1.4),
  row.names = c("Ord.1","Ord.2","Ord.3","Ord.4")
)
solucion <- meanstdsimBYcols(datos)
Media, desviación típica y coeficiente de simetría de los datos
media std_desv simetria
Progr1 2,300 1,1284207 0,5167533
Progr2 2,525 1,2996794 0,5963531
Progr3 0,875 0,7544314 0,7237617
Progr4 2,200 1,3089436 0,6140039
Progr5 1,400 0,2943920 0,3527478

EJERCICIO 5

En este ejercicio no terminé de comprender que se nos pedía que hiciésemos con los datos, he dejado varios tanteos porque me parece interesante ver las distintas formas que he empleado para acabar teniendo el dataframe en el formato solicitado y el plot que se nos pedía.

bat <- read.table("bateria.txt", sep = ":")
datos_flat = c()
for (col in colnames(bat)){
  datos_flat <- c(datos_flat, bat[[col]]) 
}
# Wide Dataframe
index1 <- sort(c(seq(1,length(datos_flat),6), seq(2,length(datos_flat),6)))
bat_wide <- data.frame(temperatura = factor(c(rep("Baja",4), rep("Media",4), rep("Alta",4)), levels=(c("Baja", "Media", "Alta"))),
                         M1 = datos_flat[index1],
                         M2 = datos_flat[index1 +2],
                         M3 = datos_flat[index1 +4]
                         )
Primera interpretación de dataframe ‘ancho’
temperatura M1 M2 M3
Baja 130 150 138
Baja 74 159 168
Baja 155 188 110
Baja 180 126 160
Media 34 136 174
Media 80 106 150
Media 40 122 120
Media 75 115 139
Alta 20 25 96
Alta 82 58 82
Alta 70 70 104
Alta 58 45 60
# Long Dataframe
index1 <- rep(c(c(1,2), c(1,2)+6),3) + c(rep(0,4), rep(2,4), rep(4,4))
bat_long <- data.frame(material = factor(c(rep("M1",4), rep("M2",4), rep("M3",4))),
                       Baja = datos_flat[index1],
                       Media = datos_flat[index1 +12],
                       Alta = datos_flat[index1 +24]
                       )
Primera interpretación de dataframe ‘largo’
material Baja Media Alta
M1 130 34 20
M1 74 80 82
M1 155 40 70
M1 180 75 58
M2 150 136 25
M2 159 106 58
M2 188 122 70
M2 126 115 45
M3 138 174 96
M3 168 150 82
M3 110 120 104
M3 160 139 60
# Really long Dataframe (for the boxplot)
bateria <- data.frame(material = factor(rep(c(rep("M1",4), rep("M2",4), rep("M3",4)),3)),
                      temperatura = ordered(c(rep("Baja",12), rep("Media",12), rep("Alta",12)), c("Baja", "Media", "Alta")),
                      valores= c(datos_flat[index1], datos_flat[index1 +12], datos_flat[index1 +24])
                      )
Finalmente el dataframe ‘largo’ que se pedía
material temperatura valores
M1 Baja 130
M1 Baja 74
M1 Baja 155
M1 Baja 180
M2 Baja 150
M2 Baja 159
M2 Baja 188
M2 Baja 126
M3 Baja 138
M3 Baja 168
M3 Baja 110
M3 Baja 160
M1 Media 34
M1 Media 80
M1 Media 40
M1 Media 75
M2 Media 136
M2 Media 106
M2 Media 122
M2 Media 115
M3 Media 174
M3 Media 150
M3 Media 120
M3 Media 139
M1 Alta 20
M1 Alta 82
M1 Alta 70
M1 Alta 58
M2 Alta 25
M2 Alta 58
M2 Alta 70
M2 Alta 45
M3 Alta 96
M3 Alta 82
M3 Alta 104
M3 Alta 60
cols <- rainbow(3, s = 0.5)
boxplot(valores ~ material + temperatura, data = bateria,
        at = c(1:3, 5:7, 9:11), col = cols,
        names = c("", "Baja", "", "", "Media", "",  "", "Alta", ""), xaxs = FALSE,
        ylim=c(0,250), main="Duración de la batería según material y TºC",
        ylab="Duración (h)")
legend("topleft", fill = cols, legend = c("M1", "M2", "M3"), cex=0.8)