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
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,] "*" "*" "*" "*" "*" "*" "*" "*"
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
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 | 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 |
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]
)
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]
)
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])
)
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)