Qué es R?

Qué es R?

El software estadístico más poderoso y usado en el mundo


Qué es R?

"R is a language and environment for statistical computing and graphics."

Entre otras cosas R incluye:

  • capacidad para almacenar y manipular datos efectivamente
  • un conjunto de operadores para hacer cálculos sobre arreglos, particularmente matrices
  • una colección grande, coherente e integrada de herramientas para el análisis de datos
  • dispositivos gráficos para el análisis y visualización de datos, tanto en pantalla como en impreso
  • un lenguaje de programación bien desarrollado, simple y eficaz

Qué es R?

Un poco más en realidad:

  • Una gran comunidad mundial.
  • El laboratorio de muchos estadísticos y científicos de datos.
  • El principal medio para el desarrollo y la divulgación de técnicas estadísticas y de análisis de datos de vanguardia.
  • Jhon Chambers, miembro del equipo de R y co-autor de S, el lenguaje del cual se deriva R, lo describe como una interfaz: un portal a todo tipo de herramientas/algoritmos.

Setup

Setup

La página principal de R es r-project.org.

Hay instaladores para Windows y MacOS disponibles. R hace parte de varias distribuciones de Linux y se puede instalar fácilmente con los manejadores de paquetes.

Básicamente lo primero que aparece en el Comprehensive R Archive Network (CRAN): cran.r-project.org

En Mac también se puede instalar R con brew (recomendado):

    brew install homebrew/science/r

Empezando con R

Setup

Aprender a usar R puede ser (muy) frustrante.

Interfaces:

  • En Windows y Mac R viene con un GUI
  • IDE: RStudio
  • R Commander Rcmdr un GUI para R con funcionalidades estadísticas básicas.

Igualmente Emacs y Vim tienen plugins:

Ayuda para empezar

El lenguaje

Hola Mundo!

"Hola mundo!"
#> [1] "Hola mundo!"
# Esto es un comentario

y <- 2 + 2         # Asignación
y^y / 10*pi + 1    # Expresión
#> [1] 81.42477
matrix(1, nrow = y/2, ncol = y)
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    1    1    1
#> [2,]    1    1    1    1

Rudimentos del lenguaje

Usamos <- (o =) para asignar y # para iniciar un comentario.

y <- 2 + 2    # Asignación

matrix() es una función, entre paréntesis van sus argumentos (los podemos especificar por posición, por nombre o por omisión).

matrix(data = 1, y/2, y)

Para explorar un objeto o variable usamos la funcion str() (estructura)

str(matrix(data = 1, y/2, y))
#>  num [1:2, 1:4] 1 1 1 1 1 1 1 1

Para ver la ayuda de una función la precedemos con un ?.

Estructuras de datos

Vectores atómicos

logico   <- c(TRUE, FALSE, T)
entero   <- c(1L, 6L, 10L)
doble    <- c(a = 1, b = 2.5, c = 4.5)
caracter <- c("Hola", "mundo", "!")

Vectores recursivos

recursivo <- list(id = c(1, 2, 3), var = c("a", "b", "c"),
                  lista = list(4:9, TRUE))
str(recursivo)
#> List of 3
#>  $ id   : num [1:3] 1 2 3
#>  $ var  : chr [1:3] "a" "b" "c"
#>  $ lista:List of 2
#>   ..$ : int [1:6] 4 5 6 7 8 9
#>   ..$ : logi TRUE

Estructuras de datos

Dimensiones Datos homogéneos Datos heterogéneos
1 Vector atómico - vector() Lista - list()
2 Matriz - matrix() data.frame()
3 o más Arreglo - array()

Propiedades, atributos y clases

Propiedades de los vectores

## Las tres propiedades principales
typeof(logico)
#> [1] "logical"
length(entero)
#> [1] 3
attributes(doble)
#> $names
#> [1] "a" "b" "c"

Propiedades, clases y atributos

Tipos, pruebas y coerción

# Las funciones is.* y as.*  logical, integer, double, character, list
is.character(caracter)
#> [1] TRUE
as.integer(logico)
#> [1] 1 0 1
# Coerción por defecto:
mean(logico)
#> [1] 0.6666667

Propiedades, clases y atributos

Atributos

str(attributes(doble))
#> List of 1
#>  $ names: chr [1:3] "a" "b" "c"
class(doble) # Se pueden modificar: class(doble) <- "myclass"
#> [1] "numeric"
names(doble)
#> [1] "a" "b" "c"
dim(doble)
#> NULL

Datos faltantes y factores

Hay una constante lógica para especificar datos faltantes. La función is.na() evalua si hay datos faltantes.

NA # logico
NA_integer_; NA_real_; NA_character_;

La clase factor se usa para representar variables categóricas.

categoria <- factor(x = c("A", "B", "A", "A", "B"))
typeof(categoria)
#> [1] "integer"
attributes(categoria)
#> $levels
#> [1] "A" "B"
#> 
#> $class
#> [1] "factor"
table(categoria)
#> categoria
#> A B 
#> 3 2

Matrices y arreglos

matriz <- matrix(data = runif(4), ncol = 2, nrow = 2)
arreglo <- array(data = rnorm(24), c(2, 3, 4))

dim(caracter) <- c(1, 3)
caracter
#>      [,1]   [,2]    [,3]
#> [1,] "Hola" "mundo" "!"
str(arreglo)
#>  num [1:2, 1:3, 1:4] -1.1153 0.1908 -0.0383 1.0968 -0.7049 ...
ncol(matriz); dim(arreglo)
#> [1] 2
#> [1] 2 3 4

Matrices y arreglos

Algunas funciones:

Función Vectores Matrices Arreglos
Dimensión length() ncol() y nrow() dim()
Nombres names() rownames() y colnames() dimnames()
Concatenar c() cbind() y rbind() abind::abind()

Subselección (indexación)

Para empezar el operador [

# Nada - útil para más dimensiones
doble[]
#>   a   b   c 
#> 1.0 2.5 4.5
# Entero positivo
doble[c(1, 2)]
#>   a   b 
#> 1.0 2.5
# Entero negativo
doble[-c(1, 2)]
#>   c 
#> 4.5

Subselección (indexación)

# Lógico
doble[doble > 1]
#>   b   c 
#> 2.5 4.5
# Caracter
doble[c("a", "c", "c")]
#>   a   c   c 
#> 1.0 4.5 4.5

El operador [ funciona igual en listas.

Subselección

Ahora podemos combinar las anterirores formas de subindexar en matrices y arreglos, separando por coma.

matriz
#>           [,1]      [,2]
#> [1,] 0.7236547 0.8617742
#> [2,] 0.2949301 0.5858607
matriz[, c(TRUE, FALSE)]
#> [1] 0.7236547 0.2949301
matriz[1, , drop = FALSE]
#>           [,1]      [,2]
#> [1,] 0.7236547 0.8617742

Subselección

Hay dos operadores más para seleccionar. [[ permite seleccionar sólo un valor (entero positivo o caracter), pero los extrae de las listas. $ es un atajo para [[ con un argumento caracter (nombres).

Además esta la función subset() para seleccionar de forma más limpia con condiciones lógicas.

recursivo[[1]]
#> [1] 1 2 3
recursivo$lista[[1]][3:5]
#> [1] 6 7 8
subset(recursivo, c(FALSE, TRUE, FALSE))
#> $var
#> [1] "a" "b" "c"

El ubicuo data.frame

Es la estructura de datos más utilizada en R. Es una lista de vectores atómicos (!?!).

(df <- data.frame(x = c("a", "b", "c"), y = 1:3))
#>   x y
#> 1 a 1
#> 2 b 2
#> 3 c 3
df[2, 2] # Se pueden seleccionar como en las matrices
#> [1] 2
df$y[2] # Se pueden seleccionar como en las listas
#> [1] 2

El ubicuo data.frame

Se pueden combinar dos o más data.frames con las funciones rbind() y cbind()

df1 <- data.frame(x = c("a", "b"), y = 1:2)
df2 <- data.frame(x = c("c", "a"), y = c(6, 7))

(df <- rbind(df1, df2))
#>   x y
#> 1 a 1
#> 2 b 2
#> 3 c 6
#> 4 a 7

La forma más común de crearlo es con una variación de la función read.table()

El ubicuo data.frame

subset() con el data.frame

df[df$x == "a", "y", drop = FALSE]
#>   y
#> 1 1
#> 4 7
# Mejor así:
subset(df, subset = x == "a", select = y)
#>   y
#> 1 1
#> 4 7

Funciones

Las funciones también son objetos. Las creamos así:

miFuncion <- function(arg_1, arg_2, ...){
  expresion ingeniosa o util
}

En R:

  • todo lo que existe es un objeto
  • todo lo que se pasa en la consola es un llamado a una función

Vocabulario

Manipulación de datos con R moderno

R moderno o el "Hadleyverse"

  • readr, readxl y haven lectura de archivos.
  • lubridate manejo de fechas y tiempo.
  • stringr interface a stringi para manejo de caracteres.
  • dplyr y tidyr manipulación y limpieza de datos.
  • ggplot2 una gramática de gráficas.

Recordemos que install.packages() instala paquetes y library() los carga en la sesión.

Importación

# Importar de un csv (Enfoque malo)
dat <- read.csv("./data/saber2014II.csv", sep = ";", dec=",")
# head(dat)

# Importar de un csv (Enfoque correcto)
clases <- c(rep("character", 8), rep("numeric", 8), rep("NULL", 7), "character")
datos <- read.csv("./data/saber2014II.csv", sep = ";", dec=",", colClasses = clases)
library(readr)
datos <- read_csv2("./data/saber2014II.csv")

# Nuevo Paquete de Whickham para importar de Excel
library(readxl)
saber <- read_excel("./data/saber2014II.xlsx")

# Importar de SPSS con etiquetas
library(haven)
saber <- read_spss("./data/saber2014II.sav")

Manipulación

Verbos de dplyr

  • filter()
  • arrange()
  • select()
  • mutate() y transmute()
  • summarise()
  • group_by()
  • *_join()

Manipulación

Pregunta: ¿cuántos estudiantes presentaron las pruebas Saber en el año 2014 por municipio?

library(dplyr)
resumen_a <- datos %>%
  group_by(NOMBREMUNICIPIO) %>%
  summarize(DEPARTAMENTO = max(DEPARTAMENTO), TOTAL_EVALUADOS = sum(EVALUADOS)) %>%
  arrange(desc(TOTAL_EVALUADOS)) %>%
  mutate(ranking = row_number()) %>%
  select(ranking, DEPARTAMENTO, NOMBREMUNICIPIO, TOTAL_EVALUADOS)

Manipulación

resumen_a
#> Source: local data frame [1,022 x 4]
#> 
#>    ranking    DEPARTAMENTO NOMBREMUNICIPIO TOTAL_EVALUADOS
#>      (int)           (chr)           (chr)           (dbl)
#> 1        1          BOGOTA     BOGOTÁ D.C.           92799
#> 2        2       ANTIOQUIA        MEDELLIN           30185
#> 3        3           VALLE            CALI           18809
#> 4        4       ATLANTICO    BARRANQUILLA           15728
#> 5        5         BOLIVAR       CARTAGENA           12770
#> 6        6 NORTE SANTANDER          CUCUTA            9075
#> 7        7       SANTANDER     BUCARAMANGA            7540
#> 8        8          TOLIMA          IBAGUE            7487
#> 9        9    CUNDINAMARCA          SOACHA            6979
#> 10      10            META   VILLAVICENCIO            6212
#> ..     ...             ...             ...             ...

Manipulación

Pregunta: ¿cuál es el municipio de mejor desempeño del país en las pruebas saber?

resumen_b <- datos %>%
  mutate(PROMGLOBAL = (PROMMATEMATICA + PROMINGLES + PROMLECTURACRITICA + 
                       PROMSOCIALESYCIUDADANAS +  PROMCIENCIASNATURALES + 
                       PROMRAZONAMIENTOCUANTITA + PROMCOMPETENCIASCIUDADAN)/7) %>%
  group_by(NOMBREMUNICIPIO) %>%
  summarize(DEPARTAMENTO = max(DEPARTAMENTO), 
            PROMGLOBALXMPIO = sum(PROMGLOBAL * EVALUADOS) / sum(EVALUADOS)) %>%
  arrange(desc(PROMGLOBALXMPIO)) %>%
  mutate(ranking = row_number()) %>%
  select(ranking, DEPARTAMENTO, NOMBREMUNICIPIO, PROMGLOBALXMPIO) 

Manipulación

resumen_b
#> Source: local data frame [1,022 x 4]
#> 
#>    ranking DEPARTAMENTO NOMBREMUNICIPIO PROMGLOBALXMPIO
#>      (int)        (chr)           (chr)           (dbl)
#> 1        1 CUNDINAMARCA            COTA        60.95414
#> 2        2    ANTIOQUIA          RETIRO        58.63083
#> 3        3 CUNDINAMARCA           TENJO        58.02804
#> 4        4       BOYACA           PAIPA        55.98362
#> 5        5    ANTIOQUIA        SABANETA        55.73571
#> 6        6 CUNDINAMARCA       LA CALERA        55.54639
#> 7        7 CUNDINAMARCA            CHIA        55.43881
#> 8        8    ANTIOQUIA        ENVIGADO        55.32838
#> 9        9       BOYACA         DUITAMA        55.04629
#> 10      10 CUNDINAMARCA      SUBACHOQUE        54.97549
#> ..     ...          ...             ...             ...

Ayuda para ir más allá

Colofón