Tipos de datos en R

Existen 4 tipos de datos:

l <- TRUE 
print(class(l))
## [1] "logical"
n <- 23.5187
print(class(n))
## [1] "numeric"
e <- 5L
print(class(e))
## [1] "integer"
c <- 'estadística'
print(class(c))
## [1] "character"
d <- 3 - 2i
print(class(d))
## [1] "complex"

Según el tipo de dato con los que trabajemos podremos crear diferentes estructuras en R:

Estructuras de datos (fuente: Advanced-R)

Estructuras de datos (fuente: Advanced-R)

En la clase de hoy nos centraremos en las estructuras vectoriales y las operaciones algebráicas respectivas. # Álgebra lineal en R

El comando ‘concatenar’

Se escribe como c() en R y nos permite ‘vectorizar’ elementos en R. Supongamos que necesitamos computar varias operaciones sobre un mismo conjunto de números: por ejemplo con los dígitos 1,2 y 3. Podríamos guardar cada dígito en un elemento de la memoria de R y luego operar con cada elemento por separado. Alternativamente, podemos guardar los dígitos en un vector y operar con los 3 números al mismo tiempo:

x <- c(1,2,3)
print(x)
## [1] 1 2 3

Luego podemos operar algebraicamente con el vector ‘x’ como queríamos:

2*x + 1 # Operaciones algebraicas con x 
## [1] 3 5 7
x^2 # Cuadrado de x
## [1] 1 4 9
sqrt(x) # Raíz de x
## [1] 1.000000 1.414214 1.732051
log(x)  # Logaritmo de x
## [1] 0.0000000 0.6931472 1.0986123
exp(x) # Exponencial de x
## [1]  2.718282  7.389056 20.085537
sin(x) # Seno de x
## [1] 0.8414710 0.9092974 0.1411200

El comando concatenar ‘c()’ unir vectores con otros números o vectores con vectores:

c(9.2,8.5,7.1,x)
## [1] 9.2 8.5 7.1 1.0 2.0 3.0
y <- 4:9
print(y)
## [1] 4 5 6 7 8 9
c(x,y)
## [1] 1 2 3 4 5 6 7 8 9

También podemos utilizar el comando concatenar para crear vectores de ‘caracteres’:

z = c('me','encanta','trabajar','con','R')
print(z)
## [1] "me"       "encanta"  "trabajar" "con"      "R"

Que ocurre si realizamos operaciones con un vector de caracteres?

2*z 
## Error in 2 * z: argumento no-numérico para operador binario

Obtenemos un mensaje de error que indica que R no sabe como operar algebraicamente sobre elementos no-numéricos. Y que ocurre si concatenamos elementos de diferente naturaleza?

c(x,z)
## [1] "1"        "2"        "3"        "me"       "encanta"  "trabajar"
## [7] "con"      "R"

R fuerza a los elementos numéricos a volverse texto.

Existen algunos comandos que resultan de utilidad para describir las características de un vector. Por ejemplo el comando lenght() que me dice cuantos elementos tiene un vector.

length(x) # x tiene 3 elementos, luego:
## [1] 3
length(z) # z tiene 5 elementos, luego:
## [1] 5

Ejercicios:

1- Computa en R los cuadrados de los elementos del conjunto \(A=\{x| x\in \mathbb{N} \text{ y } x <11\}\).

2- Escribe unas líneas de código para calcular las primeras 10 potencias de 2.

3- Que pares de elementos de los obtenidos arriba son iguales? Es decir, para que \(n = 1,...,10\) se verifica que: \[ 2^n = n^2 \]

Acceso a elementos de un vector:

En algunos contextos necesitamos acceder a elementos de un vector. Por ejemplo, queremos el primer elemento del vector que contiene las vocales. Como lo hacemos? Usamos el comando [ ]:

z = c('a','e','i','o','u')
print(z)
## [1] "a" "e" "i" "o" "u"
z[1] # Nos devuelve el primer elemento
## [1] "a"

Y si queremos los elementos que ocupan posiciones impares en el vector?

z[c(1,3,5)] # Nos devuelve los elementos en las posiciones impares 1, 3 y 5
## [1] "a" "i" "u"

Y si queremos todos los elementos menos el primero y el último?

z[-c(1,5)] # Quitamos elementos de la posición 1 y 5 (primero y último respectivamente)
## [1] "e" "i" "o"

En otros contextos resulta interesante saber, que posición ocupa un determinado elemento de un vector. Para ello utilizamos la función which() más una condición lógica que indique lo que buscamos. Por ejemplo, si quisiéramos saber que posición ocupa la letra ‘o’:

which(z=='o') # de los elementos de z, cual es '==' (igual a) la letra 'o'
## [1] 4

Obviamente podemos combinar las condiciones usando los conectores lógicos que aprendimos en las clases anteriores:

which(z=='o' | z=='a' ) # de los elementos de z, cual es '==' (igual a) la letra 'o' o cual es = 'a'.
## [1] 1 4

También nos puede interesar cambiar algún/algunos valores particulares de un vector. Por ejemplo, quiero cambiar la vocal ‘u’ (que ocupa la posición 5 dentro del vector z) por la letra ‘m’:

z[5] = 'm' # cambiamos 'u' por 'm', ahora:
print(z)
## [1] "a" "e" "i" "o" "m"

Ejercicios:

4- Genera un vector \(x\) que contenga una secuencia de 100 números (equi-espaciados) desde el 0 hasta \(2*\pi\), para ello utiliza el comando seq() (puedes consultar la ayuda de R utilizando en este caso el comando help(seq) así ves como funciona y algunos ejemplos). Luego crea otro vector \(y = \sin(x)\) que contenga el seno de estos ángulos.

5- Selecciona los valores de la función seno que ocupan los lugares impares en el vector \(y\).

6- Selecciona los valores del vector \(y\) que cumplen la condición \(y > 1/2\).

Operaciones con vectores:

Para crear un vector, simplemente utilizamos el comando c(), por ejemplo creamos el vector \(v = (1,3)\):

v = c(1,3)
print(v)
## [1] 1 3
# Que representamos gráficamente con el comando plot y arrow:
plot(3,1, xlim=c(0,5), ylim=c(0,5), xlab="x", ylab="y", lwd=3, ,col='red', bty='n')
arrows(0,0,3,1,col='red')

Podemos definir operaciones algebraicas para un vector y entre vectores:

2*v
## [1] 2 6
2*v + 1 
## [1] 3 7
w = c(3,1)
v + w
## [1] 4 4
0.5*v + 2*w
## [1] 6.5 3.5

Como se explica, por ejemplo la suma, entre dos vectores desde una perspectiva cartesiana? Veamos con un ejemplo (en este caso en 2D) utilizando R y los comandos: plot, points y arrow

# Por ejemplo, el primer vector es v = (x = 3, y = 1):
plot(3,1, xlim=c(0,5), ylim=c(0,5), xlab="x", ylab="y", lwd=3, ,col='red', bty='n')
arrows(0,0,3,1,col='red')

# El segundo vector es w = (x = 1, y = 3):
points(1,3,lwd=3,col='blue')
arrows(0,0,1,3,col='blue')

# El vector v + w = (x = 3 + 1, y = 1 + 3):
points(4,4,lwd=3,col='green')
arrows(0,0,4,4,col='green')

# Esta operación de suma se puede ver como:
arrows(1,3,4,4,col='red',lty=3)
arrows(3,1,4,4,col='blue',lty=3)

También podemos realizar operaciones elemento-a-elemento utilizando vectores, por ejemplo:

2*v
## [1] 2 6
2*v + 1 
## [1] 3 7
w = c(3,1)
v + w
## [1] 4 4
0.5*v + 2*w
## [1] 6.5 3.5

Como se explica, por ejemplo la suma, entre dos vectores desde una perspectiva cartesiana? Veamos con un ejemplo (en este caso en 2D) utilizando R y los comandos: plot, points y arrow

print(v)
## [1] 1 3
print(w)
## [1] 3 1
v*w   # El elemento i-esimo de v por el elemento i-esimo de w.
## [1] 3 3
v^w   # Potencias diferentes.
## [1] 1 3
w*exp(v) # Productos y exponenciales diferentes.
## [1]  8.154845 20.085537
  • Producto interior: nos sirve para identificar el grado de perpendicularidad entre dos vectores. Este concepto se hará muy relevante a lo largo de toda tu carrera!. En general, sean \(\mathbf{v} =(v_1,\dots,v_n)\) y \(\mathbf{w} =(w_1,\dots,w_n)\) dos vectores que pertenecen al espacio vectorial \(\mathbb{R}^n\), el producto interior se define como:

\[ \langle (v_1,\dots,v_n), (w_1,\dots,w_n) \rangle = \mathbf{v}^T\mathbf{w} = \sum_{i=1}^n v_i w_i, \]

donde el ángulo entre los dos vectores estará ligado con este producto: \[ \cos\Big(\theta_{\mathbf{v},\mathbf{w}}\Big)= \frac{\mathbf{v}^T\mathbf{w}}{||\mathbf{v} || . ||\mathbf{w} ||}, \] donde \(||\mathbf{x}|| = \Big(\mathbf{x}^T\mathbf{x}\Big)^{1/2} = \sqrt{\sum_{i=1}^n x_i^2}\).

Cómo calculamos normas y productos interiores en R?

x = c(0,5,-1)
y = c(1/2,-2,7)

print(x,y)
## [1]  0  5 -1
# Producto interior:
sum(x*y) 
## [1] -17
# Alternativamente podemos definir operaciones entre objetos algebraicos con los comandos '%'
x%*%y 
##      [,1]
## [1,]  -17
# Norma de un vector, por ejemplo el vector x:
sum(x*x)^0.5 
## [1] 5.09902
sqrt(x%*%x)
##         [,1]
## [1,] 5.09902

Ejercicios:

7- Grafica el vector \(\mathbf{v} = (x = -1, y = 0)\) y el vector \(\mathbf{w} = (x = 0, y = 2)\).

8- Obtén analíticamente (con papel y lápiz) la siguiente combinación lineal: \(\mathbf{z} = -2\mathbf{v} + 5 \mathbf{w}\). Comprueba que tus resultados son correctos utilizando el R. Genera una gráfica en R que represente dicha combinación lineal.

9- Determina el ángulo entre estos dos vectores de manera analítica (con un papel y un lápiz) y comprueba que tus resultados son correctos con R. Grafíca ambos vectores en R para asegurarte que tus resultados analíticos y tu resultados computacionales son correctos.

Otras funciones aplicadas sobre vectores:

Las funciones son comandos de R que ya vienen pre-programados, y simplemente se aplican sobre vectores. La estructura general de las funciones (ya veremos más adelante como crear nuestras propias funciones en R) es muy intuitiva: fun(‘objeto sobre el que se aplica’, ‘parámetro/s de la función’). Por ejemplo, en algunos contextos resulta interesante ‘redondear’ números (hacia abajo o hacia arriba), para ello utilizamos la función floor, ceiling, round y trunc:

x = c(-1.90,-1.46,2.36,2.92)
print(x)
## [1] -1.90 -1.46  2.36  2.92
floor(x) # Redondeo 'hacia abajo'
## [1] -2 -2  2  2
ceiling(x) # Redondeo 'hacia arriba'
## [1] -1 -1  3  3
round(x,1) # Redondeo 'a 1 decimal' (este es un parámetro de la función round que puedo cambiar!)
## [1] -1.9 -1.5  2.4  2.9
trunc(x) # Trunca el número quitando la parte decimal
## [1] -1 -1  2  2

También nos puede interesar calcular sumas, sumas acumuladas, valores absolutos, maximos, mínimos u ordenar los elementos de un vector:

print(x)
## [1] -1.90 -1.46  2.36  2.92
sum(x) # Suma de los elementos de x
## [1] 1.92
cumsum(x) # Suma acumulativa de los elementos de x
## [1] -1.90 -3.36 -1.00  1.92
abs(x) # Devuelve los valores absolutos de los elementos de x
## [1] 1.90 1.46 2.36 2.92
max(x) # Máximo
## [1] 2.92
min(x) # Mínimo
## [1] -1.9
sort(x,decreasing = T) # Ordenamos 'descendentemente' (parámetro de la función!) los elementos de x
## [1]  2.92  2.36 -1.46 -1.90