Como recomendación general, es bueno abrir un script nuevo en RStudio y comenzar a copiar los comandos que se irán mostrando.
Durante el curso utilizaremos un paquete en especial, que se llama forecast.
Para instalar paquetes, se puede hacer desde RStudio o desde la consola. Una vez instalado, hay que llamarlo cada vez que se inicia la sesión:
install.packages("forecast")
library(forecast) # también puede ser utilizado require(forecast). Y el nombre puede ir entre comillas también: library("forecast")
# El símbolo gato denosta un comentario. Todo lo que esté después será ignorado. Es útil ir comentando el código para no olvidar la funcionalidad o explicación
# de ciertos puntos. A tomar apuntes dentro del mismo código!Con la librería instalada y cargada, comenzaremos a ver como operar el programa. Cualquier otra librería que sea necesario utilizar, puede ser instalada de la misma forma y antes de poder usarle, debe ser cargada.
A diferencia de Excel, el modo en que se almacena un objeto es sumamente importante para poder operar de buena forma. En R, hay una serie de tipos que son muy utilizados. Entre los principales, están: numeric (integer, double), logical (boolean), character (string), date y factor.
Otra diferencia importante, es que R si discierne entre mayúsculas y minúsculas. Por lo tanto, la palabra “hola” es distinto de “Hola” y de “HOLA”.
"hola" == "Hola"
"hola" == "HOLA"## [1] FALSE
## [1] FALSE
Veamos como queda almacenado el siguiente número:
v1 <- 3
class(v1)
typeof(v1)
mode(v1)## [1] "numeric"
## [1] "double"
## [1] "numeric"
Y ahora, forzando a que sea entero:
v2 <- integer(3)
class(v2)
typeof(v2)
mode(v2)## [1] "integer"
## [1] "integer"
## [1] "numeric"
Y como caracteres:
v3 <- "3"
class(v3)
typeof(v3)
mode(v3)## [1] "character"
## [1] "character"
## [1] "character"
¿Cuál es la importancia de esto?
v3 - 1## Error in v3 - 1: non-numeric argument to binary operator
as.numeric(v3) - 1## [1] 2
Puedes ver probar los restantes tipos con logical y factor. Date lo veremos más adelante.
Puedes convertir entre tipos, utilizando la familia de funciones as.TIPO. Algunos ejemplos son: as.logical, as.character, as.numeric, as.integer, as.double, as.Date y as.factor.
Si necesitas ayuda con alguna función de R, puedes utilizar ? antes de la función en cuestión para desplegar la ayuda. Por ejemplo, ?as.numeric, desplegará la ayuda de esa función. Utilizando ?? seguido de una palabra, puedes encontrar información sobre funciones relacionadas a esa palabra. Por ejemplo, ??"reserved words" muestra todas las funciones que mencionan las palabras reservadas del programa.
Cada tipo de objeto puede ser almacenado en diferentes estructuras, algunas muy similares a una hoja de cálculo de Excel. En estricto rigor estas estructuras son también objetos, pero haremos esta distinción para que sea más fácl entenderlas. Algunas de ellas son:
c(), matrix, data.frame, list y array son los comandos que te permitirán generar estas estrucutras. Puedes utilizar as.ESTRUCTURA para convertir de una estructura a otra y is.ESTRUCTURA para revisar si un objeto es de algún tipo en particular.
Puedes generar de manera muy simple un vector con números consecutivos:
vector1 <- c(1:20) # Números del 1 al 20.
vector1## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Podemos ver que hay 3 formas idénticas de generar un vector con números del 1 al 20:
c(1:20) == 1:20## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [15] TRUE TRUE TRUE TRUE TRUE TRUE
1:20 == as.vector(1:20)## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [15] TRUE TRUE TRUE TRUE TRUE TRUE
1:20 == c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [15] TRUE TRUE TRUE TRUE TRUE TRUE
Este mismo vector lo podemos guardar en una matriz de 5x4 (5 filas y 4 columnas:
matriz1 <- matrix(vector1, nrow=5)
matriz1## [,1] [,2] [,3] [,4]
## [1,] 1 6 11 16
## [2,] 2 7 12 17
## [3,] 3 8 13 18
## [4,] 4 9 14 19
## [5,] 5 10 15 20
No es necesario especificar el número de columnas si generas la matriz a partir de un vector de largo definido como el que usamos recién. Puedes repetir el mismo ejercicio, pero ahora definiendo el número de columnas en vez del de filas, con ncol. Puedes alterar el orden en que se van llenando los datos desde el vector con byrow = TRUE y también puede darles nombre a las columnas y filas don dimnames = list(FILAS, COLUMNAS). Como siempre, ?matrix te dará mayor detalle y ejemplos de como utilizarlo. Veamos un ejemplo un poco más completo:
matriz2 <- matrix(vector1, nrow=5, byrow=TRUE, dimnames=list(1:5, LETTERS[1:4]))
matriz2## A B C D
## 1 1 2 3 4
## 2 5 6 7 8
## 3 9 10 11 12
## 4 13 14 15 16
## 5 17 18 19 20
# Sin byrow
matriz3 <- matrix(vector1, nrow=5, byrow=FALSE, dimnames=list(1:5, LETTERS[1:4]))
matriz3## A B C D
## 1 1 6 11 16
## 2 2 7 12 17
## 3 3 8 13 18
## 4 4 9 14 19
## 5 5 10 15 20
# Con 10 columnas
matriz4 <- matrix(vector1, ncol=10, byrow=TRUE, dimnames=list(1:2, LETTERS[1:10]))
matriz4## A B C D E F G H I J
## 1 1 2 3 4 5 6 7 8 9 10
## 2 11 12 13 14 15 16 17 18 19 20
Hay un par de cosas a las cuales prestar atención en el ejemplo anterior. El argumento dimnames (completamente opcional), es una lista. En este caso, es una lista que está compuesta por dos vectores. Números de 1 a n (siendo n el número de filas) y letras del abecedario para las columnas. LETTERS es una constante que viene por defecto en R (más información…. ?LETTERS). De la constante LETTERS extrajimos las primeras 4 o 10 letras según corresponde a las dimensiones de la matriz.
LETTERS## [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q"
## [18] "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
LETTERS[1:10] # Las primeras 10 letras## [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
vector1[11:20] # Los últimos 10 números de nuestro primer vector## [1] 11 12 13 14 15 16 17 18 19 20
vector1[11:length(vector1)] # Los mismos 10 últimos numeros anteriores...## [1] 11 12 13 14 15 16 17 18 19 20
Y ahora, nuestra tercera matriz la podemos convertir en un Data Frame; y luego podemos generar uno nosotros mismos.
df1 <- as.data.frame(matriz3)
df2 <- data.frame(A=1:5, B=6:10, C=11:15, D=16:20)¿Son df1 y df2 idénticos?