#' Suma de los elementos de un vector
#'
#' Calcula la suma de todos los elementos de un vector numérico.
#'
#' @param v Un vector numérico.
#' @return La suma de los elementos del vector.
#' @examples
#' suma(c(1, 2, 3)) # Devuelve 6
<- function(v) {
suma <- 0
resultado for (i in 1:length(v)) {
<- resultado + v[i]
resultado
}return(resultado)
}
Soluciones de la Práctica de la Unidad 5
Vectores
Ejercicio 1
Ejercicio 2
#' Suma componente a componente de dos vectores
#'
#' Suma dos vectores numéricos de igual longitud, elemento a elemento.
#' Si las longitudes no coinciden, se detiene con error.
#'
#' @param u Un vector numérico.
#' @param v Un vector numérico.
#'
#' @return Un vector numérico con la suma componente a componente.
#'
#' @examples
#' sumar_vectores(c(1, 2, 3), c(4, 5, 6)) # Devuelve c(5, 7, 9)
<- function(u, v) {
sumar_vectores <- length(u)
nu <- length(v)
nv if (nu != nv) {
stop("Las dimensiones de los vectores no coinciden.")
}<- numeric(nu)
suma for (i in 1:nu) {
<- u[i] + v[i]
suma[i]
}return(suma)
}
Ejercicio 3
#' Ordenar un vector numérico de forma ascendente
#'
#' Ordena los elementos de un vector numérico en orden ascendente usando un
#' algoritmo de comparación simple.
#'
#' @param v Un vector numérico.
#'
#' @return Un vector numérico con los elementos ordenados de menor a mayor.
#'
#' @examples
#' ordenar_asc(c(3, 1, 4, 2)) # Devuelve c(1, 2, 3, 4)
<- function(v) {
ordenar_asc <- length(v)
n for (i in 1:n) {
for (j in i:n) {
if (v[i] > v[j]) {
<- v[i]
tmp <- v[j]
v[i] <- tmp
v[j]
}
}
}return(v)
}
Ejercicio 4
#' Máximo de un vector numérico
#'
#' Encuentra el valor máximo en un vector numérico y su posición.
#'
#' @param v Un vector numérico.
#'
#' @return Un vector numérico de longitud 2. El primer elemento es el valor
#' máximo, y el segundo, la posición donde se encuentra (primera aparición).
#'
#' @examples
#' maximo(c(4, 2, 7, 1)) # Devuelve c(7, 3)
#' maximo(c(10)) # Devuelve c(10, 1)
<- function(v) {
maximo <- length(v)
n <- v[1]
mayor <- 1
posicion for (i in 1:n) {
# Desde i = 1 para que también funcione si n = 1
if (v[i] > mayor) {
<- v[i]
mayor <- i
posicion
}
}<- c("mayor" = mayor, "posicion" = posicion)
resultado return(resultado)
}
Ejercicio 5
Producto escalar de dos vectores.
#' Producto escalar de dos vectores #' #' Calcula el producto escalar entre dos vectores numéricos de igual #' longitud. #' #' @param u Un vector numérico. #' @param v Un vector numérico. #' #' @return Un número que representa el producto escalar entre u y v. #' @details Se detiene con error si las longitudes no coinciden. #' #' @examples #' prod_escalar(c(1, 2, 3), c(4, 5, 6)) # Devuelve 32 #' prod_escalar(c(1, 2), c(1, 2, 3)) # Error <- function(u, v) { prod_escalar <- length(u) nu <- length(v) nv if (nu != nv) { stop("Las dimensiones de los vectores no coinciden.") }<- 0 suma for (i in 1:nu) { <- suma + u[i] * v[i] suma }return(suma) }
Producto vectorial de dos vectores de dimensión 3
#' Producto vectorial de dos vectores de dimensión 3 #' #' Calcula el producto vectorial entre dos vectores numéricos de dimensión #' 3. #' #' @param u Un vector numérico de longitud 3. #' @param v Un vector numérico de longitud 3. #' #' @return Un vector numérico de longitud 3 que representa el producto #' vectorial u × v #' #' @details Se detiene con error si alguno de los vectores no tiene #' dimensión 3. #' #' @examples #' prod_vectorial(c(1, 0, 0), c(0, 1, 0)) # Devuelve c(0, 0, 1) #' prod_vectorial(c(1, 2), c(3, 4)) # Error <- function(u, v) { prod_vectorial <- length(u) nu <- length(v) nv if (nu != 3 || nv != 3) { stop("Los vectores no son de dimensión 3.") }<- c(u[2] * v[3] - u[3] * v[2], resultado 3] * v[1] - u[1] * v[3], u[1] * v[2] - u[2] * v[1]) u[return(resultado) }
Producto mixto de tres vectores de dimensión 3
#' Producto mixto de tres vectores de dimensión 3 #' #' Calcula el producto mixto de tres vectores u, v y w de dimensión 3, #' definido como el producto escalar de w con el producto vectorial de u y v #' #' @param u Un vector numérico de longitud 3. #' @param v Un vector numérico de longitud 3. #' @param w Un vector numérico de longitud 3. #' #' @return Un número que representa el producto mixto. #' @details Se detiene con error si alguno de los vectores no tiene #' dimensión 3. #' #' @examples #' prod_mixto(c(1, 0, 0), c(0, 1, 0), c(0, 0, 1)) # Devuelve 1 #' prod_mixto(c(1, 2), c(3, 4, 5), c(6, 7, 8)) # Error <- function(u, v, w) { prod_mixto <- prod_vectorial(u, v) resultado1 <- prod_escalar(resultado1, w) resultado2 return(resultado2) }
Mostrar productos vectoriales y escalares entre tres vectores
#' Mostrar productos vectoriales y escalares entre tres vectores #' #' Calcula y muestra por consola el producto escalar entre v y w, #' el producto vectorial entre u y w, y el producto mixto entre v, w y u. #' #' @param u Un vector numérico de longitud 3. #' @param v Un vector numérico de longitud 3. #' @param w Un vector numérico de longitud 3. #' #' @return No devuelve un valor, solo imprime los resultados por consola. #' #' @examples #' mostrar_productos(c(5, 8, 2), c(2, 3, -1), c(1, 2, 3)) <- function(u, v, w) { mostrar_productos <- prod_escalar(v, w) prod_esc <- prod_mixto(v, w, u) prod_mix cat("El producto escalar entre v y w es:", prod_esc, "\n") cat("El producto mixto entre v, w y u es:", prod_mix, "\n") <- c("prod_escalar" = prod_esc, "prod_mixto" = prod_mix) resultado return(resultado) }
Ejercicio 6
#' Mostrar números primos hasta n usando distintos enfoques de la Criba de
#' Eratóstenes
#'
#' Esta función muestra los números primos hasta n utilizando distintos enfoques
#' de la criba de Eratóstenes.
#' El argumento enfoque permite elegir entre varias implementaciones:
#' "asumir_primos", "tachar", o "encerrado".
#'
#' @param n Un número entero positivo que indica el límite superior para
#' la búsqueda de primos.
#' @param enfoque Un string que indica el enfoque a usar: "asumir_primos",
#' "tachar" o "encerrado".
#'
#' @details
#' Los enfoques disponibles son:
#'
#' - "asumir_primos"
#' Parte de un vector lógico donde todos los números son considerados primos
#' inicialmente (excepto el 1). Luego, se descartan los múltiplos de cada
#' número que aún es considerado primo.
#'
#' - "tachar"
#' Utiliza un vector "tachado" para marcar con TRUE los números que no son
#' primos (es decir, los tachados). Comienza tachando el 1, y luego los
#' múltiplos de cada número no tachado. Los primos son los que quedan sin
#' tachar al final.
#'
#' - "encerrado"
#' Usa un vector lógico llamado "encerrado" donde todos los números empiezan
#' como TRUE. Cada vez que se encuentra un primo, se marcan (ponen en FALSE)
#' todos sus múltiplos, indicando que ya no están "encerrados".
#'
#' @return Ninguno. La función imprime en consola los números primos encontrados.
#'
#' @examples
#' mostrar_primos(30, enfoque = "asumir_primos")
#' mostrar_primos(30, enfoque = "tachar")
#' mostrar_primos(30, enfoque = "encerrado")
<- function(n, enfoque = c("asumir_primos", "tachar", "encerrado")) {
mostrar_primos if (enfoque == "asumir_primos") {
<- rep(TRUE, n)
es_primo 1] <- FALSE
es_primo[for (i in 2:n) {
if (es_primo[i]) {
print(i)
<- 2 * i
j while (j <= n) {
<- FALSE
es_primo[j] <- j + i
j
}
}
}else if (enfoque == "tachar") {
} <- logical(n)
tachado 1] <- TRUE
tachado[for (i in 2:n) {
if (!tachado[i]) {
print(i)
<- 2 * i
j while (j <= n) {
<- TRUE
tachado[j] <- j + i
j
}
}
}else if (enfoque == "encerrado") {
} <- rep(TRUE, n)
encerrado for (i in 2:n) {
if (encerrado[i]) {
print(i)
for (j in seq(i, n, i)) {
<- FALSE
encerrado[j]
}
}
}
} }
Matrices
Ejercicio 7
#' Suma de dos matrices
#'
#' Esta función toma dos matrices del mismo tamaño y devuelve una nueva matriz
#' que representa la suma elemento a elemento de ambas. Si las dimensiones
#' no coinciden, imprime un mensaje de error y devuelve NULL
#'
#' @param A Una matriz numérica.
#' @param B Una matriz numérica del mismo tamaño que A.
#'
#' @return Una matriz con la suma de A y B
#' @details Produce error si las dimensiones no coinciden.
#'
#' @examples
#' A <- matrix(1:4, nrow = 2)
#' B <- matrix(5:8, nrow = 2)
#' sumar_matrices(A, B)
<- function(A, B) {
sumar_matrices if (nrow(A) != nrow(B) || ncol(A) != ncol(B)) {
stop("Las dimensiones de las matrices no coinciden.")
}<- matrix(NA, nrow(A), ncol(A))
suma for (i in 1:nrow(A)) {
for (j in 1:ncol(A)) {
<- A[i, j] + B[i, j]
suma[i, j]
}
}return(suma)
}
Ejercicio 8
Mínimo de una matriz y su posición.
#' Mínimo de una matriz y su posición #' #' Esta función recorre una matriz y devuelve un vector con el valor mínimo #' y su posición (fila y columna) dentro de la matriz. #' #' @param m Una matriz numérica. #' #' @return Un vector numérico de longitud 3 con los siguientes valores: #' - Posición 1: El valor mínimo encontrado en la matriz. #' - Posición 2: La fila donde se encuentra el valor mínimo. #' - Posición 3: La columna donde se encuentra el valor mínimo. #' #' @examples #' matriz <- matrix(c(3, 2, 5, 1, 4, 6), nrow = 2) #' minimo_matriz(matriz) <- function(m) { minimo_matriz <- m[1, 1] min <- 1 fila <- 1 col for (i in 1:nrow(m)) { for (j in 1:ncol(m)) { if (m[i, j] < min) { <- m[i, j] min <- i fila <- j col } } }<- c(minimo = min, fila = fila, columna = col) resultado return(resultado) }
Encontrar el valor mínimo en una fila específica de una matriz.
#' Encontrar el valor mínimo en una fila específica de una matriz #' #' Esta función busca el valor mínimo dentro de una fila específica de una #' matriz y devuelve el valor junto con el número de columna donde se #' encuentra. #' #' @param m Una matriz numérica. #' @param fila Un entero que indica el número de fila en la que se desea #' buscar el valor mínimo. #' #' @return Un vector numérico de longitud 2con los siguientes valores: #' - Posición 1: El valor mínimo en la fila especificada. #' - Posición 2: El número de columna donde se encuentra ese valor mínimo. #' #' @examples #' matriz <- matrix(c(3, 2, 5, 1, 4, 6), nrow = 2) #' minimo_matriz_fila(matriz, 1) <- function(m, fila = 1) { minimo_matriz_fila <- m[fila, 1] min <- 1 col for (j in 1:ncol(m)) { if (m[fila, j] < min) { <- m[fila, j] min <- j col } }return(c(minimo = min, columna = col)) }
Ejercicio 9
Ordenar matriz por columna en orden descendente.
#' Ordenar matriz por columna en orden descendente #' #' Esta función ordena las filas de una matriz numérica según los valores #' de una columna específica, en orden descendente. #' #' @param m Una matriz #' @param col Un entero que indica el índice de la columna por la que se #' desea ordenar. #' #' @return La matriz ordenada por la columna especificada en orden #' descendente. #' #' @examples #' m <- matrix(c(1, 2, 3, 4, 5, 6), ncol = 2, byrow = TRUE) #' ordenar_desc_col(m, 1) <- function(m, col) { ordenar_desc_col if (nrow(m) > 1) { for (i in 1:(nrow(m)-1)) { for (j in (i+1):nrow(m)) { if (m[i, col] < m[j, col]) { for (k in 1:ncol(m)) { <- m[i, k] tmp <- m[j, k] m[i, k] <- tmp m[j, k] } } } } }return(m) }
Observaciones
- En lugar de chequear si tiene más de una fila, podríamos directamente poner
for (i in 1:nrow(m))
yfor (j in i:nrow(m))
. Esto funciona también cuando la matriz provista tiene una sola fila, pero en cualquier otro caso implica a hacer comparaciones lógicas de más, tantas como número de filastenga la matriz. - Se puede mejorar la función agregando un control para que el argumento
col
provisto por el usuario esté siempre entre 1 yncol(m)
.
- En lugar de chequear si tiene más de una fila, podríamos directamente poner
Ordenar matriz por fila en orden ascendente.
#' Ordenar matriz por fila en orden ascendente #' #' Esta función ordena las columnas de una matriz numérica según los valores #' de una fila específica, en orden ascendente. #' #' @param m Una matriz numérica. #' @param fila Un entero que indica el índice de la fila por la que se desea #' ordenar. #' #' @return La matriz ordenada por la fila especificada en orden ascendente. #' #' @examples #' m <- matrix(c(3, 1, 4, 2, 6, 5), nrow = 2, byrow = TRUE) #' ordenar_asc_fila(m, 1) <- function(m, fila) { ordenar_asc_fila if (ncol(m) > 1) { for (i in 1:(ncol(m) - 1)) { for (j in (i + 1):ncol(m)) { if (m[fila, i] > m[fila, j]) { # Solo cambia el signo for (k in 1:nrow(m)) { <- m[k, i] tmp <- m[k, j] m[k, i] <- tmp m[k, j] } } } } }return(m) }
Ejercicio 10
#' Verificar si una matriz es un cuadrado mágico
#'
#' Esta función verifica si una matriz cuadrada numérica es un cuadrado mágico.
#' Un cuadrado mágico es una matriz en la que la suma de los elementos en cada
#' fila, en cada columna y en las dos diagonales principales es igual.
#'
#' @param cuadrado Una matriz cuadrada numérica.
#'
#' @return `TRUE` si la matriz es un cuadrado mágico, `FALSE` en caso contrario.
#'
#' @examples
#' m <- matrix(c(2, 7, 6, 9, 5, 1, 4, 3, 8), nrow=3, byrow=TRUE)
#' cuadrado_magico(m)
<- function(cuadrado) {
cuadrado_magico <- nrow(cuadrado)
n
# Calcular el primer total fila para tener de control
<- 0
control for (j in 1:n) {
<- control + cuadrado[1, j]
control
}
# Calcular los restantes totales filas y chequearlos
for (i in 2:n) {
<- 0
total for (j in 1:n) {
<- total + cuadrado[i, j]
total
}if (total != control) {
return(FALSE)
}
}
# Chequear totales columnas si lo anterior estuvo bien
for (j in 1:n) {
<- 0
total for (i in 1:n) {
<- total + cuadrado[i, j]
total
}if (total != control) {
return(FALSE)
}
}
# Chequear diagonales si lo anterior estuvo bien
<- 0
diag1 <- 0
diag2 for (i in 1:n) {
<- diag1 + cuadrado[i, i]
diag1 <- diag2 + cuadrado[n - i + 1, i]
diag2
}if (diag1 != control || diag2 != control) {
return(FALSE)
}
# Si llegamos hasta acá es porque todos los controles dieron bien
return(TRUE)
}
Operaciones vectorizadas
Ejercicio 11
<- c(2, 5, 8, 1, 9)
x x
[1] 2 5 8 1 9
# a)
log(x, base = 5)
[1] 0.4306766 1.0000000 1.2920297 0.0000000 1.3652124
# b)
which(x > 4)
[1] 2 3 5
# c)
>4] x[x
[1] 5 8 9
# d)
length(x[x>4])
[1] 3
sum(x>4)
[1] 3
# e)
%% 2 == 0] x[x
[1] 2 8
# f)
sum(x[x>5])
[1] 17
Ejercicio 12
<- matrix(1:9, nrow = 3)
m m
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
# a)
+ 10 m
[,1] [,2] [,3]
[1,] 11 14 17
[2,] 12 15 18
[3,] 13 16 19
# b)
^(1/3) m
[,1] [,2] [,3]
[1,] 1.000000 1.587401 1.912931
[2,] 1.259921 1.709976 2.000000
[3,] 1.442250 1.817121 2.080084
# c)
* 2 m
[,1] [,2] [,3]
[1,] 2 8 14
[2,] 4 10 16
[3,] 6 12 18
# d)
<- matrix(9:1, nrow = 3)
n - n m
[,1] [,2] [,3]
[1,] -8 -2 4
[2,] -6 0 6
[3,] -4 2 8
# e)
sum(m > 5)
[1] 4
# f)
> 5] # muestra los valores mayores que 5 como un vector m[m
[1] 6 7 8 9
# g)
which(m > 5, arr.ind = TRUE)
row col
[1,] 3 2
[2,] 1 3
[3,] 2 3
[4,] 3 3
# h)
sum(m)
[1] 45
mean(m)
[1] 5
rowSums(m)
[1] 12 15 18
colSums(m)
[1] 6 15 24
rowMeans(m)
[1] 4 5 6
colMeans(m)
[1] 2 5 8
Ejercicio 13
<- 1:20
x # a)
> 10 & x %% 3 == 0] x[x
[1] 12 15 18
# b)
!(x %% 2 == 0 | x %% 5 == 0)] x[
[1] 1 3 7 9 11 13 17 19
%% 2 != 0 & x %% 5 != 0] x[x
[1] 1 3 7 9 11 13 17 19
# c)
length(x[x %% 2 != 0 & x %% 5 != 0])
[1] 8
sum(x %% 2 != 0 & x %% 5 != 0)
[1] 8
Ejercicio 14
La función es
sum()
. Se puede usar tanto con vectores como con matrices.<- c(60, -5, 0, 12, 1) mi_vector # Nuestra función suma(mi_vector)
[1] 68
# La función de R Base sum(mi_vector)
[1] 68
Basta con hacer:
<- c(5, 8, 2) u <- c(2, 3, -1) v + v u
[1] 7 11 1
<- matrix(c(5, 8, 2, 2, 3, 1), nrow = 3) A <- matrix(c(0, -1, 3, 1, 2, 4), nrow = 3) B + B A
[,1] [,2] [1,] 5 3 [2,] 7 5 [3,] 5 5
La función es
sort()
<- c(60, -5, 0, 12, 1) mi_vector # Por defecto, sort() ordena de forma ascendente sort(mi_vector)
[1] -5 0 1 12 60
# Podemos definir decreasing = TRUE para ordenar en forma descendente sort(mi_vector, decreasing = TRUE)
[1] 60 12 1 0 -5
Si se aplica en vectores de tipo carácter, ordena alfabéticamente:
<- c("introducción", "a", "la", "programación") mi_vector sort(mi_vector)
[1] "a" "introducción" "la" "programación"
sort(mi_vector, decreasing = TRUE)
[1] "programación" "la" "introducción" "a"
Usamos
min()
ymax()
:# Vectores <- c(60, -5, 0, -5, 12, 1) mi_vector min(mi_vector)
[1] -5
max(mi_vector)
[1] 60
# Ubicación del mínimo o máximo (sólo primera ocurrencia) which.min(mi_vector)
[1] 2
which.max(mi_vector)
[1] 1
# Ubicación del mínimo o máximo (todas las ocurrencias) which(mi_vector == min(mi_vector))
[1] 2 4
which(mi_vector == max(mi_vector))
[1] 1
# También sirve para vectores de tipo carácter <- c("introducción", "a", "la", "programación") mi_vector min(mi_vector)
[1] "a"
# Matrices <- matrix(c(5, 8, 2, 7, 3, 1), nrow = 3) A A
[,1] [,2] [1,] 5 7 [2,] 8 3 [3,] 2 1
min(A)
[1] 1
max(A)
[1] 8
# Posición (arr.ind = TRUE para que nos indique fila y columna) which(A == min(A), arr.ind = TRUE)
row col [1,] 3 2
which(A == max(A), arr.ind = TRUE)
row col [1,] 2 1
Se puede hacer:
<- c(5, 8, 2) u <- c(2, 3, -1) v sum(u * v)
[1] 32
# Usando la function del Ejercicio 5a: prod_escalar(u, v)
[1] 32
De la siguiente forma:
A
[,1] [,2] [1,] 5 7 [2,] 8 3 [3,] 2 1
# Evaluamos min() sólo en la fila 3 min(A[3, ])
[1] 1
# Para saber en qué columna de la fila 3 se encuentra su mínimo: which.min(A[3, ])
[1] 2
# Con la función del ejecicio 8b minimo_matriz_fila(A, 3)
minimo columna 1 2
Una posibilidad es:
<- function(cuadrado) { cuadrado_magico # Todos las sumas <- rowSums(cuadrado) sumas_filas <- colSums(cuadrado) sumas_col <- sum(diag(cuadrado)) suma_diag1 <- sum(diag(cuadrado[nrow(cuadrado):1, ])) suma_diag2 # Junto las sumas en un vector, deberían ser todoas iguales # Arbitrariamente dejo afuera a suma_diag2, para comparar con ella <- c(sumas_filas, sumas_col, suma_diag1) sumas # ¿Dieron igual todas las sumas? return(all(sumas == suma_diag2)) } <- matrix(c(16, 3, 2, 13, cuadrado 5, 10, 11, 8, 9, 6, 7, 12, 4, 15, 14, 1), nrow = 4, byrow = TRUE) cuadrado_magico(cuadrado)
[1] TRUE
<- matrix(c( 0, 3, 2, 13, cuadrado 5, 10, 11, 8, 9, 6, 7, 12, 4, 15, 14, 1), nrow = 4, byrow = TRUE) cuadrado_magico(cuadrado)
[1] FALSE
Listas, funciones apply()
y más
Ejericico 15
<- list( mi_lista numeros = 1:10, letras = LETTERS, matriz = matrix(0, nrow = 2, ncol = 2), lista_anidada = list( valores_logicos = c(TRUE, FALSE), mi_texto = "¡Ayuda! Estoy dentro de una lista anidada." ) )
$lista_anidada$mi_texto mi_lista
[1] "¡Ayuda! Estoy dentro de una lista anidada."
length(mi_lista)
[1] 4
Ejercicio 16
<- c(2, 1, 9)
a <- c("X", "Y", "Z")
b <- list(b, a) d
2]] d[[
[1] 2 1 9
1]][1] <- "M" d[[ d
[[1]] [1] "M" "Y" "Z" [[2]] [1] 2 1 9
# Creación de la lista <- list(1:10, "Buenas", TRUE) mi_lista mi_lista
[[1]] [1] 1 2 3 4 5 6 7 8 9 10 [[2]] [1] "Buenas" [[3]] [1] TRUE
# De manera vectorizada le sumamos 2 a cada elemento del vector y lo # guardamos en el mismo lugar 1]] <- mi_lista[[1]] + 2 mi_lista[[ # Cambiar el TRUE por FALSE 3]] <- FALSE mi_lista[[ mi_lista
[[1]] [1] 3 4 5 6 7 8 9 10 11 12 [[2]] [1] "Buenas" [[3]] [1] FALSE
Ejercicio 17
#' Cociente de la división de números naturales
#'
#' @description
#' Calcula el cociente entero y el resto en la división de dos números naturales.
#'
#' @details
#' La función devuelve una lista con el dividendo, divisor, cociente, resto y
#' un valor lógico que indica si el divisor es divisor exacto del dividendo.
#'
#' @param dividendo,divisor Números naturales.
#'
#' @return Una lista con los valores: dividendo, divisor, cociente, resto, y es_divisor.
#'
#' @examples
#' cociente(1253, 4)
#' cociente(3, 4)
<- function(dividendo, divisor) {
cociente <- dividendo
resto <- 0
coc while (resto >= divisor) {
<- coc + 1
coc <- resto - divisor
resto
}<- resto == 0
es_divisor
return(
list(
dividendo = dividendo,
divisor = divisor,
cociente = coc,
resto = resto,
es_divisor = es_divisor
)
) }
Ejercicio 18
set.seed(34) <- matrix(sample(100, 20), nrow = 4) m m
[,1] [,2] [,3] [,4] [,5] [1,] 93 50 29 80 20 [2,] 33 8 11 61 99 [3,] 9 86 48 67 100 [4,] 10 54 44 43 46
# Crear vector para guardar los promedios <- numeric(ncol(m)) promedios # Calcular iterando a través de las filas for (j in 1:ncol(m)) { <- mean(m[, j]) promedios[j] } promedios
[1] 36.25 49.50 33.00 62.75 66.25
apply(m, 2, mean)
[1] 36.25 49.50 33.00 62.75 66.25
Ejercicio 19
A <- matrix(seq(1, 100, length.out = 9), ncol = 3)
B <- matrix(rep(1:3 * 5, 3), ncol = 3)
C <- matrix(rep(1:2 * 4, each = 6), ncol = 2)
AB <- rbind(A, B)
ABC <- cbind(AB, C)
Ejercicio 20
<- list( stock_frutas naranjas = 10, manzanas = 15, peras = 5 )
<- list( stock_verduras tomates = 8, cebollas = 12 )
<- list( stock_verduleria frutas = stock_frutas, verduras = stock_verduras )
# Usando el operador "$" $verduras$zanahorias <- 10 stock_verduleria # Usando la función append() $verduras <- append(stock_verduleria$verduras, list(zanahorias = 10)) stock_verduleria
Ejercicio 21
Lectura del archivo para cargar los objetos que contiene en el ambiente global. Recordar que si el archivo no se encuentra en el working directory, se debe especificar la ruta informática completa o cambiarlo.
load("popurri.RData")
Hay 5 objetos:
cosa1
: vector numérico de largo 3cosa2
: vector carácter de largo 5cosa3
: matriz numérica de dimensión 10x3cosa4
: lista con 4 elementos:- 1° elemento, con nombre “letras”: matriz carácter de dimensión 3x6
- 2° elemento, con nombre “mediciones”: vector numérico de largo 10
- 3° elemento, con nombre “respuestas”: vector lógico de largo 6
- 4° elemento, con nombre “numeros”: matriz numérica de dimensión 10x10
cosa5
: lista con 5 elementos, todos ellos vectores numéricos de distinto largo.
cosa1
[1] 0.85659039 0.01082598 0.55285632
names(cosa1) <- c("valorA", "valorB", "valorC") cosa1
valorA valorB valorC 0.85659039 0.01082598 0.55285632
3] # Indexando según posición cosa1[
valorC 0.5528563
"valorC"] # Indexando según nombre cosa1[
valorC 0.5528563
2]] # Indexando según posición cosa4[[
[1] 1.08915250 0.76896317 -0.06656841 1.06452895 0.08372996 0.72989718 [7] 0.14348919 1.08879924 -0.97206064 -1.39850426
"mediciones"]] # Indexando según nombre (1) cosa4[[
[1] 1.08915250 0.76896317 -0.06656841 1.06452895 0.08372996 0.72989718 [7] 0.14348919 1.08879924 -0.97206064 -1.39850426
$mediciones # Indexando según nombre (2) cosa4
[1] 1.08915250 0.76896317 -0.06656841 1.06452895 0.08372996 0.72989718 [7] 0.14348919 1.08879924 -0.97206064 -1.39850426
sort(cosa4$mediciones)
[1] -1.39850426 -0.97206064 -0.06656841 0.08372996 0.14348919 0.72989718 [7] 0.76896317 1.06452895 1.08879924 1.08915250
t(cosa4$numeros)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 883 18 139 30 487 887 787 261 852 532 [2,] 435 714 903 932 967 658 44 138 476 630 [3,] 940 894 872 783 71 211 37 103 115 208
min(cosa4$numeros)
[1] 18
apply(cosa4$numeros, 2, max)
[1] 887 967 940
<- seq(1, 100, length.out = 9) x
<- matrix(x, nrow = 3) y
<- rbind(cosa4$numeros, y) z
<- c(cosa1, cosa4$numeros, cosa1) w names(w) <- NULL w
[1] 0.85659039 0.01082598 0.55285632 883.00000000 18.00000000 [6] 139.00000000 30.00000000 487.00000000 887.00000000 787.00000000 [11] 261.00000000 852.00000000 532.00000000 435.00000000 714.00000000 [16] 903.00000000 932.00000000 967.00000000 658.00000000 44.00000000 [21] 138.00000000 476.00000000 630.00000000 940.00000000 894.00000000 [26] 872.00000000 783.00000000 71.00000000 211.00000000 37.00000000 [31] 103.00000000 115.00000000 208.00000000 0.85659039 0.01082598 [36] 0.55285632
lapply()
devuelve los resultados en una lista ysapply()
en un vector.# Con una estructura for <- numeric(length(cosa5)) maximos for (i in 1:length(cosa5)) { <- max(cosa5[[i]]) maximos[i] } maximos
[1] 1.363091 1.083697 1.002246 1.387853 1.713647
# Con lapply lapply(cosa5, max)
[[1]] [1] 1.363091 [[2]] [1] 1.083697 [[3]] [1] 1.002246 [[4]] [1] 1.387853 [[5]] [1] 1.713647
# Con sapply sapply(cosa5, max)
[1] 1.363091 1.083697 1.002246 1.387853 1.713647
Se aplica la función
max()
a cada elemento de la listacosa4
. En el vectorletras
obtuvo el “máximo” al ordenar los datos de tipo carácter alfabeticamente. En el vectormediciones
obtuvo el máximo valor numérico. En el vector de valores lógicosrespuestas
el máximo fue 1 porque los valoresFALSE
son considerados como 0 y losTRUE
como 1. En la matriznumeros
obtuvo el máximo valor en toda la matriz.sapply(cosa4, max)
letras mediciones respuestas numeros "Z" "1.08915250302242" "1" "967"
Se aplica la función
sqrt()
a cada elemento de la listacosa4
, pero como hay elementos que no tienen datos numéricos, como el vector carácterletras
, tratar de sacarles la raiz cuadrada produce un error.lapply(cosa4, sqrt) Error in FUN(X[[i]], ...) : non-numeric argument to mathematical function
Se obtiene un vector lógico del mismo largo con un
TRUE
en cada posición donde hay un número mayor a cero yFALSE
en caso contrario.$mediciones > 0 cosa4
[1] TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
$mediciones[cosa4$mediciones > 0] cosa4
[1] 1.08915250 0.76896317 1.06452895 0.08372996 0.72989718 0.14348919 1.08879924
<- abs(cosa3) < 1 v v
[,1] [,2] [,3] [1,] FALSE TRUE TRUE [2,] FALSE TRUE TRUE [3,] TRUE FALSE TRUE [4,] FALSE TRUE TRUE [5,] TRUE TRUE TRUE [6,] TRUE TRUE TRUE [7,] TRUE TRUE TRUE [8,] TRUE TRUE FALSE [9,] TRUE TRUE TRUE [10,] FALSE TRUE TRUE
En R los valores lógicos
TRUE
son evaluados como 1 y losFALSE
como 0. Por eso al aplicarle la suma a una matriz de valores lógicos se obtiene la cantidad de valoresTRUE
. Luego,sum(v)
nos dice cuántos valores en la matrizcosa3
tienen valor absoluto menor que 1.apply(v, 1, sum)
indica cuántosTRUE
hay en cada fila, mientras queapply(v, 2, sum)
, cuántosTRUE
hay en cada columna.sum(v)
[1] 24
apply(v, 1, sum)
[1] 2 2 2 2 3 3 3 2 3 2
apply(v, 2, sum)
[1] 6 9 9
w
[1] 0.85659039 0.01082598 0.55285632 883.00000000 18.00000000 [6] 139.00000000 30.00000000 487.00000000 887.00000000 787.00000000 [11] 261.00000000 852.00000000 532.00000000 435.00000000 714.00000000 [16] 903.00000000 932.00000000 967.00000000 658.00000000 44.00000000 [21] 138.00000000 476.00000000 630.00000000 940.00000000 894.00000000 [26] 872.00000000 783.00000000 71.00000000 211.00000000 37.00000000 [31] 103.00000000 115.00000000 208.00000000 0.85659039 0.01082598 [36] 0.55285632
> 500] <- -100 w[w w
[1] 0.85659039 0.01082598 0.55285632 -100.00000000 18.00000000 [6] 139.00000000 30.00000000 487.00000000 -100.00000000 -100.00000000 [11] 261.00000000 -100.00000000 -100.00000000 435.00000000 -100.00000000 [16] -100.00000000 -100.00000000 -100.00000000 -100.00000000 44.00000000 [21] 138.00000000 476.00000000 -100.00000000 -100.00000000 -100.00000000 [26] -100.00000000 -100.00000000 71.00000000 211.00000000 37.00000000 [31] 103.00000000 115.00000000 208.00000000 0.85659039 0.01082598 [36] 0.55285632