soluciones
- Definir una función que, dados los coeficientes «a,b,c» de una ecuación de segundo grado (\(a x^2 + b x + c = 0\)),
devuelva sus raíces reales (sin parte imaginaria), en caso de haberlas.
resolver2grado <- function (a, b, c) { d <- b^2 - 4*a*c # discriminante if (d > 0) (-b + c(-1,1) * sqrt(d)) / (2 * a) else if (d == 0) -b / 2 / a else {warning ("sin solución real"); c()} }
- Ídem pero devolviendo siempre dos soluciones complejas.
resolver2grado <- function (a, b, c) (-b + c(-1,1) * sqrt (b^2 - 4 * a * c + 0i)) / (2 * a) ## o bien: resolver2grado <- function (a, b, c) (-b + c(-1,1) * sqrt (as.complex (b^2 - 4 * a * c))) / (2 * a)
- Se define el fectorial del entero \(z\in\mathbf{Z}\) como
\[
\mathcal F(z) = \prod_{i=z}^{-1}\,i %= i\cdot(i+1)\cdots(-2)\cdot(-1)
\]
o bien, recursivamente, como
\[ \mathcal F(-1) = -1\qquad \mathcal F(z) = z\cdot\mathcal F(z') \]
donde \(z'=z+1\) si \(z<-1\) y \(z'=z-1\) si \(z>-1\).
Escribe una función en R que calcule el fectorial de su argumento.
## versio'n iterativa fectorial <- function (n) { producto <- 1 for (i in n:-1) producto <- producto * i producto } ## versio'n recursiva fectorial <- function (n) if (n == -1) -1 else n * fectorial (n + ifelse(n>=0, -1, 1)) ## versio'n vectorial fectorial <- function (n) prod (n:-1)
- Dibujar la función de densidad de una distribución ji-cuadrado de 5 grados de libertad.
Sombrear las dos colas del 5% de probabilidad cada una, es decir, del 0 al percentil 5 y del percentil 95 hasta «infinito».
minx <- 0; maxx <- qchisq(0.99,5) plot (x <- seq(minx,maxx,0.01), dchisq (x, 5), type="l") lines (x <- seq(minx,qchisq(0.05,5),0.001), dchisq (x, 5), type="h") lines (x <- seq(qchisq(0.95,5),maxx,0.001), dchisq (x, 5), type="h")
- Hacer un diagrama de dispersión de la longitud de pétalo frente a la longitud de sépalo, con los datos
del dataframe «iris» (si no estuviera, ejecutar «library(datasets);data(iris)»).
Que la
setosa
aparezcan de color rojo; lasversicolor
, de color azul; y lasvirginica
, de verde.plot (Petal.Length ~ Sepal.Length, iris, color = rep (c("red","blue","green"), each=50))
- Definir una variable «m» que contenga en la celda «i;j» el valor de «i» \(\times\) «j».
m <- matrix (NA, 10, 10) for (i in 1:10) for (j in 1:10) m[i,j] <- i * j # otra opción for (i in 1:10) m[i,] <- i * 1:10
- Definir una variable «m» que contenga por ejemplo en la celda «3;5» una cadena con el texto "3 × 5 = 15".
m <- matrix (NA, 10, 10) for (i in 1:10) for (j in 1:10) m[i,j] <- paste (i, "×", j, "=", i * j)
- Definir una variable «d» que sea un dataframe de 1000 filas y que
- la primera columna sean valores aleatorios de una uniforme U(0;1)
- la segunda, aleatorios gausianos N(170;15)
- la tercera, aleatorios exponenciales de esperanza 5
- la cuarta, aleatorios puasones de esperanza 20
- la quinta, letras aleatorias del alfabeto inglés (variable «letters») con la misma probabilidad
- la sexta, vocales (a, e, i, o, u) aleatorias donde la «u» tenga el doble de probabilidad que cada una de las otras
unif <- runif (1000, 0, 1) gaus <- rnorm (1000, 170, 15) expo <- rexp (1000, 1/5) puas <- rpois (1000, 20) letr <- sample (letters, 1000, replace=TRUE) voca <- sample (c("a","e","i","o","u"), 1000, replace=TRUE, prob=c(1,1,1,1,2)) d <- data.frame (unif, gaus, expo, puas, letr, voca)
- Obtener sendos vectores de nombres de variables cuantitativas y cualitativas de «d».
cuantitativas <- cualitativas <- c() for (i in 1:ncol(d)) if (is.numeric (d[[i]])) cuantitativas <- c (cuantitativas, names(d)[i]) else cualitativas <- c (cualitativas, names(d)[i]) # otra forma cuantitativas <- names (d) [sapply (d, is.factor)] cualitativas <- names (d) [sapply (d, is.numeric)]
- Definir una lista «l» de longitud 6 tal que su elemento «i»-ésimo sea el resultado de aplicar «summary» a
la «i»-ésima variable de «d».
# una forma: l <- list(); for (i in 1:6) l <- c (l, list (summary (d[,i]))) # otra forma: l <- list(); for (i in 1:6) l[[i]] <- summary (d[,i]) # otra forma: l <- lapply (d, summary)
- Añadir nombres a la lista para identificar cada sumario con su variable.
names (l) <- names (d) # otra forma (resultado distinto) l <- list(); for (i in 1:6) l[[i]] <- list (names(d)[i], summary(d[,i]))
- Considerar los datos «mtcars». Obtener una lista que contenga por la media y desviación típica de «mpg» por cada valor
de «cyl».
lista <- by (mtcars$mpg, mtcars$cyl, function (x) c (mean (x), sd (x)))
- Generar 10.000 valores de medias muestrales de muestras de tamaño 100 de una población gausiana de
esperanza 170 y desviación típica 15. Calcular la desviación típica de las medias muestrales.
medias <- replicate (10000, rnorm (100, 170, 15)) sd (medias) # debería estar en torno a 1,5 = 15÷√100