Flujo de trabajo en R

Proyectos en RStudio

Trabajar con proyectos en RStudio permite organizar nuestro flujo de trabajo, manteniendo en un único espacio sus distintos componentes:

  • Scripts (archivo, por ejemplo en formato txt, que contiene un conjunto de códigos u órdenes que serán ejecutadas por el software),
  • Datos (inputs en general, o transformaciones de datos originales),
  • Resultados de análisis realizados y figuras (outputs de procesamientos),
  • Etcétera.

Crear un nuevo proyecto en RStudio

En la barra de menú, click en file > New Project, y luego:

R Scripts

Es posible escribir y ejecutar código directamente en la Consola, y guardar los resultados de los distintos procesamientos y análisis en nuestro environment (podemos ver los objetos creados en el panel correspondiente). Esta forma de trabajo no resulta conveniente, ya que no nos permitirá “recuperar” nuestro trabajo en el futuro.

Los scripts son archivos de texto plano donde guardaremos los códigos u órdenes que ejecutaremos en la Consola, y nos permitirán "recrear nuestro environment espacio de de trabajo.

Crear un nuevo script en un proyecto de RStudio

Dos alternativas:

  • click en file > R Script
  • Ctrl + Shift + N

Conceptos básicos de codificación

R como calculadora

# El símbolo de numeral a la izquierda permite realizar comentarios a los códigos
2*6  # Multiplicación
## [1] 12
23*32 + 34^2  # Puede utilizarse tanto el operador "^" como "**" para la potencia 
## [1] 1892
10/(1+3)  
## [1] 2.5
10%/%(1+3)  # El operador %/% expresa división entera
## [1] 2
cos(pi)  # Coseno del número Pi
## [1] -1

Operadores relacionales

Permiten describir comparaciones entre dos objetos (por ej. \(x\) e \(y\)), de las que se obtiene como resultado verdadero (TRUE) o falso (FALSE).

Operador Descripción
x < y x es menor (estricto) que y
x <= y x es menor o igual que y
x > y x es mayor (estricto) que y
x >= y x es menor o igual que y
x == y x es exactamente igual que y
x != y x es no es igual que y
5 <= 7
## [1] TRUE
4 == 8
## [1] FALSE
5 != 3
## [1] TRUE

Operadores lógicos

Permiten describir relaciones lógicas (operaciones de álgebra Booleana), expresadas como verdadero (TRUE) o falo (FALSE).

Operador Descripción
x | y x o y son verdaderos
x & y x e y son verdaderos
!x x no es verdadero (negación)
TRUE & FALSE  # Al menos un Falso -> Falso
## [1] FALSE
TRUE & TRUE  # Ambos Verdadero -> Verdadero
## [1] TRUE
TRUE | FALSE  # Si al menos uno es Verdadero -> Verdadero 
## [1] TRUE
TRUE | TRUE
## [1] TRUE
FALSE | FALSE  # Ambos Falso -> Falso
## [1] FALSE

Objetos

Los Objetos/Elementos constituyen la categoría escencial de R. Todo en R puede ser un objeto:

Los objetos que vamos creando a medida que trabajamos pueden visualizarse en la panel derecho superior de la pantalla (environment).

El operador <- sirve para definir un objeto. A la izquierda del <- debe ubicarse el nombre que tomará el elemento a crear (por ej. value). Del lado derecho debe ir la definición del mismo: object_name <- value (i.e. se trata de un operador unidericcional).

El operador = es equivalente a <-, pero en la práctica no se utiliza para la definición de objetos.

Los nombres que se empleen no debe poseer espacios, y deben evitarse algunos nombresreservados por R para determinados elementos (pi) o funciones (mean).

Caracteres especiales

Funciones

Las funciones son series de procedimientos estandarizados (códigos, algoritmos, etc.), que toman como input determinados argumentos a fijar por el usuario (algunos están dados por defectos y pueden setearse). Su lógica de funcionamiento es:
funcion(argumento1 = arg1, argumento2 = arg2)

Algunos ejemplos:

  • paste() : concatena una serie de caracteres, indicando por última instancia como separar a cada uno de ellos
  • paste0(): concatena una serie de caracteres sin separar
  • sum(): suma de todos los elementos de un vector
  • mean() promedio aritmético de todos los elementos de un vector
paste("Pega", "estas", 4, "palabras", sep = " ")  # para indicar que se trata de texto/caracteres, lo indicamos con comillas.
## [1] "Pega estas 4 palabras"
paste("Pega", "estas", 4, "palabras", sep = "*")
## [1] "Pega*estas*4*palabras"
sum(1:5) # 1:5 devulve los numeros enteros de 1 al 5. También puede emplearse c(1, 2, 3, 4, 5)
## [1] 15
mean(1:5, na.rm = TRUE)
## [1] 3

Valores

Los valores y vectores pueden ser a su vez de distintas clases:

Numeric

x <- 23*32 + 34^2
x  # Retorna el elemento correspondiente al objeto x
## [1] 1892
class(x) # tipo o clase de objeto/variable
## [1] "numeric"
y <- x # Ahora "x" toma el valor de "y", e "y" continua conservando el mismo valor

Character

A <-  paste('Soy', 'una', 'concatenación', 'de', 'caracteres', sep = " ")
A
## [1] "Soy una concatenación de caracteres"
class(A)
## [1] "character"

Factor

A <- factor(c("perro", "gato", "canario")) # consultar help(factor) 
A
## [1] perro   gato    canario
## Levels: canario gato perro
class(A)
## [1] "factor"

La diferencia entre un character y un factor es que el último tiene solo algunos valores permitidos (levels), con un orden interno predefinido (el cual, por ejemplo, se respetará a la hora de realizar un gráfico)

Consultar help(factor)

Vectores

Para crear un vector utilizamos el comando c(), de combinar.

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

Sumamos 2 a cada elemento del vector anterior:

x2 <- x + 2
x2
## [1] 3 5 7

Suma de vectores:

y <- 1:3  # También puede usarse c(1, 2, 3) o bien seq(1, 3)
z <- x + y 
z
## [1] 2 5 8

Creamos un vector que contenga las palabras: “Carlos”,“Federico”,“Pedro”

E <- c("Carlos", "Federico", "Pedro")
E
## [1] "Carlos"   "Federico" "Pedro"

Podemos acceder a algún elemento del vector (y de datos estruturados en general) mediante indexación. Existen diferentes formas según el tipo de objeto; en el casode vectores se utilizan el operador de selección [ ].

x[3]
## [1] 5
E[2]
## [1] "Federico"

Si nos interesa almacenar dicho valor, al buscarlo lo asignamos a un nuevo objeto con el nombre deseado:

elemento2 <-  E[2]
elemento2
## [1] "Federico"

Selección negativa:

x[-3]  # Selección negativa (no quedamos con todo, excepto el elemento 3 del vector)
## [1] 1 3

Para remover un objeto del ambiente de trabajo, utilizamos la función rm()

rm(elemento2)
elemento2
## Error in eval(expr, envir, enclos): objeto 'elemento2' no encontrado

También podemos cambiar el texto del segundo elemento de E, por el texto “Juan”

E[2] <- "Juan"
E
## [1] "Carlos" "Juan"   "Pedro"

Matrices

Empleamos la función matrix, que tiene los siguientes argumentos:

  • data: conjunto de datos a incorporar la matriz (en forma de vector).
  • nrow: cantidad de filas deseadas para la matriz. Alternativamente se puede especificar cantidad de columna (ncol).
  • byrow: valor lógico. Por defecto asume FALSE, por lo que ordena al vector definido en “data” como columnas en la conformación de la matriz.
a <- c(6, 2, 3, 2, 15, 6, 3, 6, 3)  # datos que incorporaremos en la matriz
V <- matrix(a, nrow = 3, byrow = TRUE)  # mediante "byrow" indicamos si la ordenamos por fila por 
V
##      [,1] [,2] [,3]
## [1,]    6    2    3
## [2,]    2   15    6
## [3,]    3    6    3
D <- diag(diag(V))  # Armamos una matriz diagonales con los elementos de la doagonal principal de V
D
##      [,1] [,2] [,3]
## [1,]    6    0    0
## [2,]    0   15    0
## [3,]    0    0    3
D <- sqrt(solve(D)) # solve devuelve la inversa de D
D
##           [,1]      [,2]      [,3]
## [1,] 0.4082483 0.0000000 0.0000000
## [2,] 0.0000000 0.2581989 0.0000000
## [3,] 0.0000000 0.0000000 0.5773503
R <- D %*% V %*% D  # %*% se emplea para producto de matrices
R  # Observación: Si asumimos que V es una matriz de varianzas-covarianzas, R es una matriz de correlación
##           [,1]      [,2]      [,3]
## [1,] 1.0000000 0.2108185 0.7071068
## [2,] 0.2108185 1.0000000 0.8944272
## [3,] 0.7071068 0.8944272 1.0000000

Data Frames

Un data frame es una tabla de datos, donde cada columna representa una variable y cada fila una observación. Este tipo de objetos son típicos en el proceso de trabajo con base de datos.

La función para crear un objeto de este tipo es data.frame().

Veamos el siguiente ejemplo de “juguete”.

INDICE  <- c(100,   100,   100,
             101.8, 101.2, 100.73,
             102.9, 102.4, 103.2)

FECHA  <-  c("Ago-19", "Ago-19", "Ago-19",
             "Sep-19", "Sep-19", "Sep-19",
             "Oct-19", "Oct-19", "Oct-19")

GRUPO  <-  c("Privado_Registrado","Público","Privado_No_Registrado",
             "Privado_Registrado","Público","Privado_No_Registrado",
             "Privado_Registrado","Público","Privado_No_Registrado")
             
datos <- data.frame(INDICE, FECHA, GRUPO)
datos

En un dataframe las “indexaciones” se realizan ubicando sus elementos de de la siguiente manera: [fila, columna].

Alternativamente, se puede especificar la columna (variable) correspondiente mediante el operador $, y luego seleccionar dentro de la columna el registro deseado mediante el número de orden.

datos$FECHA  # obtenemos la columna "FECHA"
## [1] Ago-19 Ago-19 Ago-19 Sep-19 Sep-19 Sep-19 Oct-19 Oct-19 Oct-19
## Levels: Ago-19 Oct-19 Sep-19
datos[3,2]  # obtenemos el dato de la fila 3 y columna 2 (FECHA)
## [1] Ago-19
## Levels: Ago-19 Oct-19 Sep-19
datos$FECHA[3]  # idem anterior
## [1] Ago-19
## Levels: Ago-19 Oct-19 Sep-19

¿Qué sucede si hacemos datos$FECHA[3,2] ?

datos$FECHA[3,2]
## Error in `[.default`(datos$FECHA, 3, 2): número incorreto de dimensiones

El acceso a los dataframes mediante [ ] puede utilizarse para realizar filtros sobre la base, especificando una condición para las filas. Por ejemplo, puedo utilizar los [ ] para conservar del dataframe datos unicamente los registros con fecha de Octubre 2019:

datos[datos$FECHA=="Oct-19", ]

Si queremos filtrar por más de una condición para las filas de una determinada variable podemos emplear %in% c().

datos[datos$FECHA %in% c("Sep-19", "Oct-19") ,]

Filtros incluyendo operadores lógicos:

datos[datos$FECHA == "Sep-19" & datos$INDICE > 101,]
datos[datos$FECHA == "Sep-19" | datos$INDICE > 101,]

También podemos aplicar el filtro y al mismo tiempo identificar una variable de interés para luego realizar un cálculo sobre aquella. Por ejemplo, podríamos calcular la media de los indices en el mes de Octubre.

### Por separado
Indices_Oct <- datos$INDICE[datos$FECHA=="Oct-19"]
Indices_Oct
## [1] 102.9 102.4 103.2
mean(Indices_Oct)
## [1] 102.8333
### Todo junto
mean(datos$INDICE[datos$FECHA=="Oct-19"])
## [1] 102.8333