<- c(60, -5, 0, 12, 1)
mi_vector suma(mi_vector)
[1] 68
<- 3
x suma(x)
[1] 3
Suma de los elementos de un vector
Definir una función llamada suma(v)
que reciba un vector numérico v
de cualquier longitud y devuelva la suma de sus elementos. Ejemplos de su uso:
<- c(60, -5, 0, 12, 1)
mi_vector suma(mi_vector)
[1] 68
<- 3
x suma(x)
[1] 3
Suma de vectores
La suma de dos vectores de la misma dimensión está dada por un nuevo vector donde cada elemento es igual a la suma de los elementos que ocupan la misma posición en los vectores originales. Por ejemplo:
\[ \bar{u} + \bar{v} = \begin{pmatrix} 5 \\ 8 \\ 2 \end{pmatrix} + \begin{pmatrix} 2 \\ 3 \\ -1 \end{pmatrix} = \begin{pmatrix} 7 \\ 11 \\ 1 \end{pmatrix} \]
Definir una función llamada sumar_vectores(u, v)
que reciba dos vectores u
y v
de la misma dimensión y devuelva su suma. La función debe devolver un error informativo si los largos de ambos vectores no son iguales. Ejemplos de su uso:
<- c(5, 8, 2)
u <- c(2, 3, -1)
v sumar_vectores(u, v)
[1] 7 11 1
<- 10
x <- 2
y sumar_vectores(x, y)
[1] 12
<- c(5, 8, 2)
w <- c(2, 3)
z sumar_vectores(w, z)
Error in sumar_vectores(w, z): Las dimensiones de los vectores no coinciden.
Ordenar los elementos de un vector numérico
Definir una función llamada ordenar_asc(v)
que tome como entrada un vector numérico v
de cualquier largo y lo devuelva con sus elementos ordenados en forma ascendente (de menor a mayor). La función debe cubrir el caso en el que el largo de v
sea 1 (en cuyo caso devuelve el valor provisto, sin arrojar errores). Ejemplos de su uso:
<- c(60, -5, 0, 12, 1)
mi_vector ordenar_asc(mi_vector)
[1] -5 0 1 12 60
<- 1
x ordenar_asc(x)
[1] 1
Hallar el máximo de un vector
Definir una función llamada maximo(v)
que encuentre cuál es el mayor valor en un vector numérico v
. La función debe devolver un vector con dos elementos, el primero es el valor del máximo y el segundo es la posición en la cual el mismo se halla en el vector v
. Si dicho mayor valor estuviese repetido en el vector, se determina la posición de su primera ocurrencia. El vector devuelto debe hacer uso del atributo names. Ejemplos de su uso:
<- c(60, -5, 0, 120, 1)
mi_vector maximo(mi_vector)
mayor posicion
120 4
<- 6
x maximo(x)
mayor posicion
6 1
Álgebra vectorial
Dados dos vectores \(\bar u = (u_1, u_2, ..., u_n)\) y \(\bar v = (v_1, v_2, ..., v_n)\), ambos \(\in \mathbf{R}^n\), se define como producto escalar al escalar: \(\bar u \times \bar v = u_1v_1+u_2v_2+....+u_nv_n\).
Definir una función llamada prod_escalar(u, v)
que tome dos vectores u
y v
de la misma dimensión y devuelva el producto escalar entre ellos. La función debe devolver un error informativo si largo de los vectores no admite esta operación. Ejemplos de su uso:
<- c(5, 8, 2)
u <- c(2, 3, -1)
v prod_escalar(u, v)
[1] 32
<- 10
x <- 2
y prod_escalar(x, y)
[1] 20
<- c(5, 8, 2)
w <- c(2, 3)
z prod_escalar(w, z)
Error in prod_escalar(w, z): Las dimensiones de los vectores no coinciden.
Dados dos vectores \(\bar u = (u_1, u_2, u_3)\) y \(\bar v = (v_1, v_2, v_3)\), ambos \(\in \mathbf{R}^3\), se define como producto vectorial de \(\bar u\) con \(\bar v\) al vector de \(\mathbf{R}^3\): \(\bar u \wedge \bar v = (u_2v_3-u_3v_2, u_3v_1-u_1v_3, u_1v_2-u_2v_1)\).
Definir una función llamada prod_vectorial(u, v)
que tome dos vectores u
y v
de largo 3 y devuelva el producto vectorial entre ellos. La función debe devolver un error informativo si los vectores no son de dimensión 3. Ejemplos de su uso:
<- c(5, 8, 2)
u <- c(2, 3, -1)
v prod_vectorial(u, v)
[1] -14 9 -1
<- c(5, 8)
w <- c(2, 3)
z prod_vectorial(w, z)
Error in prod_vectorial(w, z): Los vectores no son de dimensión 3.
Dados tres vectores \(\bar u\), \(\bar v\) y \(\bar w \in \mathbf{R}^3\), se llama producto mixto de \(\bar u\), \(\bar v\) y \(\bar w\), en ese orden, al escalar: \(\bar u \wedge \bar v \times \bar w\).
Haciendo uso de las funciones definidas en los ítems anteriores, definir una función llamada prod_mixto(u, v, w)
que tome tres vectores de largo 3 y devuelva el producto mixto entre ellos. Ejemplo de su uso:
<- c(5, 8, 2)
u <- c(2, 3, -1)
v <- c(1, 2, 3)
w <- c(1, 2)
x prod_mixto(u, v, w)
[1] 1
prod_mixto(u, v, x)
Error in prod_escalar(resultado1, w): Las dimensiones de los vectores no coinciden.
Haciendo uso de las funciones definidas en los ítems anteriores, definir una función llamada mostrar_productos(u, v, w)
que tome tres vectores \(\bar u\), \(\bar v\) y \(\bar w \in \mathbf{R}^3\) y calcule y muestre en la consola:
Además, la función debe devolver un vector numérico de largo 2 con los resultados anteriores, en ese orden, con nombres. Ejemplo de su uso:
<- c(5, 8, 2)
u <- c(2, 3, -1)
v <- c(1, 2, 3)
w <- c(1, 2)
x
<- mostrar_productos(u, v, w) productos
El producto escalar entre v y w es: 5
El producto mixto entre v, w y u es: 1
productos
prod_escalar prod_mixto
5 1
1] productos[
prod_escalar
5
"prod_mixto"] productos[
prod_mixto
1
<- mostrar_productos(u, v, x) productos
Error in prod_escalar(v, w): Las dimensiones de los vectores no coinciden.
La criba de Eratóstenes
En el siglo III a.C., el astrónomo griego Eratóstenes desarrolló un algoritmo para encontrar todos los números primos menores que un número natural dado n
. El mismo consiste en anotar una tabla todos los naturales entre 2 y n
. Por ejemplo, para n = 20
, empezamos por escribir el siguiente conjunto:
Luego se encierra con un círculo el primer número del conjunto, indicando que hemos encontrado un número primo. Se recorre el resto del grupo tachando cada múltiplo del valor que hemos encerrado recién, dado que esto significa que no puede ser primo. Por lo tanto, al finalizar el primer paso del algoritmo, habremos encerrado el número 2 y tachado todos los múltiplos de 2, como se ve a continuación:
A partir de acá, simplemente se repite el proceso encerrando el primer número del conjunto que no está ni tachado ni encerrado y luego tachando todos sus múltiplos. Eventualmente, cada número en la lista quedará encerrado o tachado, como se muestra en el diagrama:
Los números encerrados son los primos, los tachados son compuestos. Este algoritmo para generar una lista de números primos se conoce como la Criba de Eratóstenes.
Definir una función llamada mostrar_primos(n, enfoque)
que se base en la criba de Eratóstenes y muestre todos los números primos hasta un número entero n
. La función debe implementar los siguientes enfoques:
"asumir_primos"
: partir de un vector lógico donde todos los números, salvo el 1, se consideran primos inicialmente. Luego, descartar los múltiplos de cada número que aún es considerado primo.
"tachar"
: utilizar un vector llamado tachado
que comience con todos los valores en FALSE
, e ir marcando con TRUE
a los números que se descartan por no ser primos (es decir, los tachados). Comenzar tachando el 1, y luego los múltiplos de cada número no tachado.
"encerrado"
: partir de un vector encerrado
en el que todos los números comiencen como TRUE
. Cada vez que se encuentre un número primo, marcar (poner en FALSE
) todos sus múltiplos, indicando que ya no están “encerrados”.
Ejemplos de uso:
mostrar_primos(15, enfoque = "asumir_primos")
[1] 2
[1] 3
[1] 5
[1] 7
[1] 11
[1] 13
mostrar_primos(15, enfoque = "tachar")
[1] 2
[1] 3
[1] 5
[1] 7
[1] 11
[1] 13
mostrar_primos(15, enfoque = "encerrado")
[1] 2
[1] 3
[1] 5
[1] 7
[1] 11
[1] 13
Suma de dos matrices
Dadas dos matrices de igual dimensión \(\mathbf{A}\) y \(\mathbf{B}\):
\[ \mathbf{A} = \begin{pmatrix} 5 & 2 \\ 8 & 3 \\ 2 & 1\end{pmatrix} \qquad \qquad \mathbf{B} = \begin{pmatrix} 0 & 1 \\ -1 & 2 \\ 3 & 4\end{pmatrix} \]
la suma entre ellas es igual a:
\[ \mathbf{A} + \mathbf{B} = \begin{pmatrix} 5 & 2 \\ 8 & 3 \\ 2 & 1\end{pmatrix} + \begin{pmatrix} 0 & 1 \\ -1 & 2 \\ 3 & 4\end{pmatrix} = \begin{pmatrix} 5 & 3 \\ 7 & 5 \\ 5 & 5\end{pmatrix} \]
Definir una función llamada sumar_matrices(A, B)
que tome dos matrices A
y B
de la misma dimensión y devuelva su suma. La función debe devolver un error informativo si las dimensiones de las matrices no coinciden. Ejemplo de su uso:
<- matrix(c(5, 8, 2, 2, 3, 1), nrow = 3)
A <- matrix(c(0, -1, 3, 1, 2, 4), nrow = 3)
B sumar_matrices(A, B)
[,1] [,2]
[1,] 5 3
[2,] 7 5
[3,] 5 5
<- matrix(c(0, -1, 3, 1, 2, 4), nrow = 2)
B sumar_matrices(A, B)
Error in sumar_matrices(A, B): Las dimensiones de las matrices no coinciden.
Hallar mínimo en una matriz
Definir una función llamada minimo_matriz(m)
que encuentre el menor valor en una matriz numérica m
y lo devuelva como el primer elemento de un vector de largo 3, el cual debe tener como segundo y tercer elemento el número de fila y de columna donde se encuentra el mínimo, respectivamente. El vector devuelto debe hacer uso del atributo names. Ejemplo de uso:
<- matrix(c(5, 8, 2, 7, 3, 1), nrow = 3)
A A
[,1] [,2]
[1,] 5 7
[2,] 8 3
[3,] 2 1
minimo_matriz(A)
minimo fila columna
1 3 2
Definir una función llamada minimo_matriz_fila(m, fila)
que encuentre el menor valor en la fila número fila
de una matriz numérica m
y devuelva un vector de largo 2, donde el primer elemento sea el valor mínimo encontrado y el segundo elemento sea el número de columna en la que lo encontró. Por defecto, la búsqueda del mínimo debe hacerse en la fila 1. El vector devuelto debe hacer uso del atributo names. Ejemplo de uso:
<- matrix(c(5, 8, 2, 7, 3, 1), nrow = 3)
A A
[,1] [,2]
[1,] 5 7
[2,] 8 3
[3,] 2 1
minimo_matriz_fila(A, 2)
minimo columna
3 2
minimo_matriz_fila(A)
minimo columna
5 1
Reordenar matriz según valores en una fila o columna
Definir una función llamada ordenar_desc_col(m, col)
que intercambie las filas de la matriz m
de modo que la misma quede con los valores de la columna número col
ordenados de forma descendente. Ejemplos de su uso:
<- matrix(c( 4, 13, 9, 17,
A 20, 14, 14, 9,
2, 16, 12, 7,
16, 2, 4, 11,
12, 20, 16, 4), nrow = 5, byrow = TRUE)
A
[,1] [,2] [,3] [,4]
[1,] 4 13 9 17
[2,] 20 14 14 9
[3,] 2 16 12 7
[4,] 16 2 4 11
[5,] 12 20 16 4
ordenar_desc_col(A, 3)
[,1] [,2] [,3] [,4]
[1,] 12 20 16 4
[2,] 20 14 14 9
[3,] 2 16 12 7
[4,] 4 13 9 17
[5,] 16 2 4 11
<- matrix(c( 4, 13, 9, 17), nrow = 1)
A A
[,1] [,2] [,3] [,4]
[1,] 4 13 9 17
ordenar_desc_col(A, 3)
[,1] [,2] [,3] [,4]
[1,] 4 13 9 17
Definir la función ordenar_asc_fila(m, fila)
para intercambiar las columnas de la matriz m
de modo que la misma quede con los valores de la fila número fila
ordenados en forma ascendente. Ejemplos de su uso:
<- matrix(c( 4, 13, 9, 17,
A 20, 14, 14, 9,
2, 16, 12, 7,
16, 2, 4, 11,
12, 20, 16, 4), nrow = 5, byrow = TRUE)
A
[,1] [,2] [,3] [,4]
[1,] 4 13 9 17
[2,] 20 14 14 9
[3,] 2 16 12 7
[4,] 16 2 4 11
[5,] 12 20 16 4
ordenar_asc_fila(A, 3)
[,1] [,2] [,3] [,4]
[1,] 4 17 9 13
[2,] 20 9 14 14
[3,] 2 7 12 16
[4,] 16 11 4 2
[5,] 12 4 16 20
<- matrix(c( 4, 13, 9, 17), nrow = 1)
A A
[,1] [,2] [,3] [,4]
[1,] 4 13 9 17
ordenar_asc_fila(A, 1)
[,1] [,2] [,3] [,4]
[1,] 4 9 13 17
Cuadrado mágico
Un cuadrado mágico es un arreglo bidimensional de enteros en el que las filas, columnas y diagonales suman el mismo valor. Uno de los cuadrados mágicos más famosos aparece en el grabado Melancolía I de Alberto Durero, justo debajo de la campana. En el mismo, todas las sumas dan 34, y además Durero acomodó el cuadrado de manera que en el centro en la fila de abajo se forme 1514, año en el que produjo el grabado.
Definir una función llamada cuadrado_magico(cuadrado)
que devuelva TRUE
si una matriz \(n \times n\) contiene un cuadrado mágico, o FALSE
en caso contrario. Ejemplos de su uso:
<- matrix(c(16, 3, 2, 13,
cuadrado 5, 10, 11, 8,
9, 6, 7, 12,
4, 15, 14, 1), nrow = 4, byrow = TRUE)
cuadrado
[,1] [,2] [,3] [,4]
[1,] 16 3 2 13
[2,] 5 10 11 8
[3,] 9 6 7 12
[4,] 4 15 14 1
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
[,1] [,2] [,3] [,4]
[1,] 0 3 2 13
[2,] 5 10 11 8
[3,] 9 6 7 12
[4,] 4 15 14 1
cuadrado_magico(cuadrado)
[1] FALSE
En esta sección utilizaremos la operatoria vectorizada de R y las funciones que el software ya trae disponibles para alcanzar los mismos objetivos que en los ejercicios anteriores y, además, realizar otras tareas.
Luego de crear el vector x <- c(2, 5, 8, 1, 9, 10, 4, 5)
:
x
.Luego de crear la matriz m <- matrix(1:9, nrow = 3)
:
m
.m
.m
y su promedio general, la suma por columnas y por filas, y el promedio por columnas y por filas.Dado el vector x <- 1:20
:
Resolución alternativa de ejercicios anteriores
¿Cuál es la función de R que se encarga de sumar los elementos de un arreglo numérico? Utilizarla en el mismo ejemplo presentado en el Ejercicio 1 y comparar resultados.
En el Ejercicio 2 escribimos una función llamada sumar_vectores(u, v)
que toma dos vectores u
y v
de la misma dimensión y devuelve su suma. De manera similar, en el Ejercicio 7 escribimos una función para sumar dos matrices. ¿Cómo podemos obtener el mismo resultado sin tener que crear estas funciones nuevas, sabiendo que en R las funciones operan de forma vectorizada?
¿Con qué función de R se pueden ordenar de forma ascendente los elementos de un vector numérico? Demostrarlo con los mismos ejemplos del Ejercicio 3. ¿Se puede aplicar esta función en vectores de tipo carácter?
¿Con qué funciones de R se pueden encontrar los valores mínimos y máximos de un vector o de una matriz? Las funciones que escribimos en el Ejercicio 4 y en el Ejercicio 8a persiguen este mismo objetivo, pero además devuelven la posición del valor buscado en el arreglo. ¿Cómo se puede hacer esto en R? ¿Se pueden aplicar estas funciones en vectores de tipo carácter?
Utilizando las funciones vectorizadas de R, ¿cómo podemos obtener de manera sencilla el producto escalar entre dos vectores, como en el Ejercicio 5a?
¿Cómo se pueden usar las funciones de R para encontrar el valor mínimo en una fila en particular de una matriz numérica, tal como se planteó en el Ejercicio 8b ? Demostrarlo con la matriz que se define a continuación, suponiendo que deseamos encontrar cuál es el mínimo en la fila 2.
<- matrix(c(5, 8, 2, 7, 3, 1), nrow = 3) A
Pensar una nueva forma de crear la función cuadrado_magico()
del Ejercicio 10 que aproveche la operatoria vectorizada de R para simplificar los cálculos.
apply()
y másCrear una lista llamada mi_lista
que contenga los siguientes elementos:
numeros
: un vector numérico que contiene los números naturales del 1 al 10letras
: un vector caracter que contiene las letras del abecedario en mayúsculasmatriz
: una matriz 2x2 cuyos elementos son todos cerolista_anidada
: una lista con dos elementos:
valores_logicos
: un vector lógico que almacena los valores TRUE
y FALSE
mi_texto
: una cadena de texto con el mensaje "¡Ayuda! Estoy dentro de una lista anidada."
¿Cómo accederías al texto dentro de la lista anidada?
¿Qué devuelve length(mi_lista)
? Responder sin correr el código. Luego verificar.
Dados los siguientes objetos, ¿cuál es el valor de d[[2]]
? Responder sin correr el código. Luego verificar.
<- c(2, 1, 9)
a <- c("X", "Y", "Z")
b <- list(b, a) d
Dados los objetos anteriores, ¿qué sentencia reemplazará la “X” en la lista d
por el valor “M”? Elegir la respuesta correcta sin correr el código. Luego verificar.
d[[1]] <- "M"
d[[1]][1] <- "M"
d[[2]][1] <- "M"
d[[1]][2] <- "M"
Dada la lista: mi_lista <- list(1:10, "Buenas", TRUE)
, escribir código que permita sumarle un 2 a cada elemento del primer vector dentro de la lista y que cambie el valor TRUE
por un FALSE
.
Modificar la función cociente()
del ejercicio 9 de la práctica 3 de modo tal que en lugar de imprimir los resultados y devolver solo el cociente entero, devuelva una lista con los siguientes elementos:
dividendo
: el número original pasado como dividendodivisor
: el número original pasado como divisorcociente
: el cociente entero de la divisiónresto
: el resto de la divisiónes_divisor
: el valor lógico TRUE
si el divisor es divisor exacto del dividendo (es decir, si el resto es cero), y FALSE
en caso contrario.Comparación entre for
y apply
Dada la matriz m
generada con valores aleatorios:
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
calcular la media de cada columna de dos maneras diferentes:
for()
.apply()
.En ambos casos se puede usar la función de R mean()
o definir una nueva función propia para calcular un promedio.
Nota: se usa la función set.seed()
para determinar una “semilla aleatoria” que asegura que los números generados al azar sean los mismos cada vez que se define la matriz, en cualquier computadora.
Crear A
, una matriz 3x3 que contenga 9 números equiespaciados entre 1 y 100.
Crear B
, una matriz 6x3 donde el valor de cada fila sea 5 veces el número de fila.
Crear C
, una matriz 6x2 donde el valor de cada columna sea 4 veces el número de columna.
Crear AB
, la matriz resultante de la unión de las filas de A
y B
.
Crear ABC
, la matriz resultante de la concatenación lado a lado de AB
y C
.
Crear stock_frutas
, una lista que almacene el stock disponible de frutas en una verdulería. Debe incluir 10 naranjas, 15 manzanas y 5 peras.
Crear stock_verduras
, una lista que almacene el stock disponible de verduras en una verdulería. Debe incluir 8 tomates y 12 cebollas.
Crear stock_verduleria
, una lista que agrupe las frutas y las verduras en una sola lista. Debe tener dos elementos: uno llamado frutas
que contenga stock_frutas
, y otro llamado verduras
que contenga stock_verduras
.
Mostrar dos formas distintas para agregar 10 zanahorias al elemento correspondiente de stock_verduleria
.
Popurrí
Cargar en el ambiente el archivo popurri.RData
y resolver las siguientes consignas:
¿Cuántos objetos están guardados en ese archivo y de qué tipo es cada uno?
Asignar los siguientes nombres a los elementos guardados en el vector cosa1
: valorA
, valorB
y valorC
.
Acceder al tercer elemento guardado en el vector cosa1
de dos formas distintas: indexando según su posición y según su nombre.
Acceder al segundo elemento guardado en la lista cosa4
de tres formas distintas.
Ordenar de menor a mayor los elementos del vector numérico perteneciente a la lista cosa4
.
Obtener la matriz traspuesta de la matriz que ocupa la cuarta posición en la lista cosa4
.
Obtener el mínimo valor de la matriz numérica guardada en la lista cosa4
y el máximo de cada una de sus columnas.
Utilizar la función seq()
para crear un vector llamado x
con 9 números equiespaciados entre 1 y 100.
Con los valores del vector x
crear una matriz de dimensión 3x3 llamada y
.
Concatenar verticalmente la matriz numeros
de la lista cosa4
y la matriz y
del punto anterior con la función rbind()
para formar una nueva matriz llamada z
de dimensión 13x3.
Crear un nuevo vector w
que contenga primero a todos los elementos del vector cosa1
, luego todos los del vector mediciones
de la lista cosa4
y finalmente otra vez todos los elementos del vector cosa1
. Eliminar el atributo names de este nuevo vector.
Hallar el valor máximo en cada vector numérico de la lista cosa5
de tres formas distintas: con un for
, con lapply()
y con sapply()
. ¿En qué difieren las formas en las que las últimas dos muestran los resultados?
Ejecutar sapply(cosa4, max)
. Explicar qué hace esa acción y por qué se obtiene cada resultado.
Ejecutar lapply(cosa4, sqrt)
. Explicar qué hace esa acción y por qué se obtiene cada resultado.
Tomar el vector mediciones
de la lista cosa4
y ejecutar: cosa4$mediciones > 0
. ¿Qué se obtiene?
Utilizar el resultado del punto anterior para mostrar únicamente los valores del vector mediciones
que son mayores a cero.
Generar una matriz de valores lógicos llamada v
que tenga TRUE
en las celdas donde el valor absoluto de los valores de cosa3
son menores a 1 y FALSE
donde es mayor o igual a 1.
Ejecutar sum(v)
e interpretar qué representa el valor obtenido. Hacer lo mismo con apply(v, 1, sum)
y apply(v, 2, sum)
.
Reemplazar en el vector w
todos los valores mayores a 500 por el valor -100.