Ariadna Sofia Contreras

Maria Isabel Jaimes

1 ¿Qué es R?

R es un lenguaje de programación y un entorno computacional especializado en el análisis estadístico. R tiene sus orígenes en R, un lenguaje de programación creado en los Laboratorios Bell de Estados Unidos. Para lograr que R sea usado sin restricciones, es distribuido de manera gratuita a través de la Licencia Pública General de GNU, por lo que es software libre y de código abierto.

Aunque R está diseñado para análisis estadístico, con el paso del tiempo los usuarios de este lenguaje han creado extensiones a R, llamadas paquetes, que han ampliado su funcionalidad. En la actualidad es posible realizar en R minería de textos, procesamiento de imagen, visualizaciones interactivas de datos y procesamiento de Big Data, entre muchas otras cosas.

Es recomendable instalar y usar un entorno integrado de desarrollo (IDE) para el uso de R. Un IDEproporciona herramientas para escribir y revisar código, administrar los archivos usados, gestionar el entorno de trabajo y algunas otras herramientas de productividad.

Hay varias opciones de IDE para R, siendo RStudio una de las más destacadas. Este entorno no solo reúne todas las funcionalidades básicas de una IDE, sino que ha sido desarrollado por un equipo que ha impulsado de forma notable la accesibilidad de R como lenguaje de programación, promoviendo especialmente la colaboración y la reproducibilidad en los procesos de análisis.

2 Conceptos básicos

2.1 La consola de R

Al iniciar R, lo primero que aparece en pantalla es información sobre la versión del lenguaje en uso y un prompt >, que marca el punto de entrada para escribir instrucciones.

Este espacio corresponde a la consola de R, el núcleo del entorno computacional donde se interpreta y ejecuta el código. En ella se pueden introducir comandos directamente y obtener los resultados de inmediato, lo que hace que R sea un lenguaje interactivo.

En el caso de utilizar RStudio, esta consola se encuentra integrada dentro de uno de sus paneles, facilitando la escritura, ejecución y visualización de resultados en un mismo entorno.

2.2 Ejecuciones

Cuando hablamos de ejecutar, llamar o correr en R, nos referimos a solicitar que el programa realice una acción específica; en otras palabras, estamos proporcionando una instrucción o entrada.

Del mismo modo, cuando decimos que R nos devuelve algo, significa que ha procesado la instrucción y está entregando una salida o resultado.

Por ejemplo, al escribir en la consola, le indicamos a R que ejecute esa operación, y el programa responde mostrando el resultado:

1+1
## [1] 2

2.3 Directorio de trabajo

El directorio de trabajo es la ubicación dentro del equipo donde se almacenan los archivos que se utilizan en R. Es el espacio predeterminado en el que el programa buscará los datos que se desean importar y donde guardará los resultados que exportemos, salvo que especifiquemos otra ruta.

Para conocer cuál es el directorio de trabajo actual, se puede usar la función getwd().

2.4 Documentación

En R, tanto las funciones incluidas en el lenguaje base como las pertenecientes a paquetes cuentan con un archivo de documentación. Este describe su propósito, los argumentos que acepta, los detalles de su funcionamiento, los valores que devuelve y ejemplos de uso.

Para consultar la documentación de una función, se puede anteponer un signo de interrogación a su nombre ?mean o utilizar la función help("mean"), ambas formas equivalentes. En RStudio, la información se muestra en un panel del entorno, mientras que en la versión básica de R se abre en el navegador web.

2.5 Paquetes

R puede ampliarse mediante paquetes, que son conjuntos de funciones creados para realizar tareas específicas, como análisis estadístico, visualización o minería de datos. Estos se distribuyen a través del CRAN, donde son verificados antes de su publicación.

Para instalarlos se usa:

install.packages("readr")

y para utilizarlos en una sesión:

library(readr)

Cada vez que se inicia R es necesario volver a cargar los paquetes, lo que favorece la compatibilidad y la claridad del código. Si el paquete no existe en el CRAN, R mostrará una advertencia. Los paquetes activos pueden consultarse con sessionInfo() y los instalados con installed.packages().

2.6 Scripts

Los scripts en R son archivos de texto con la extensión .R, que contienen código ejecutable por el programa. Aunque R permite trabajar de forma interactiva, se recomienda guardar las instrucciones en scripts para facilitar su reutilización y compartirlas con otros. En proyectos más amplios, suele ser necesario emplear varios scripts con propósitos distintos.

Estos archivos pueden ejecutarse mediante la función source(), indicando entre comillas la ruta del archivo, como en:

source("C:/Mis scripts/mi_script.R")

Al trabajar en RStudio, al abrir un archivo .R se despliega un panel donde es posible visualizar y ejecutar todo el código o solo fragmentos específicos del mismo.

3 Tipos de datos en R

Los tipos de objetos básicos en R se dividen en:

  • Numérico
  • Entero
  • Texto
  • Lógico
  • Complejo

Los cuales se definen de la siguiente manera

x_numerico <- 3.14
x_entero <- as.integer(10)
x_texto <- "Maestría en actuaría y finanzas"
x_logico <- TRUE # FALSE
x_complejo <- 2 + 3i

Con los objetos base se pueden construir elementos más complejos como:

  • Vectores
  • Listas
  • Matrices
  • Data Frames

Estos se describen a continuación.

# Vectores
v_same <- c(1, 2, 3, 4)
v_dif <- c("A", x_logico, x_complejo)
v_dif
## [1] "A"    "TRUE" "2+3i"
# Matriz
m <- matrix(1:9, nrow = 3, ncol = 3)
m
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
# Data frame
df <- data.frame(
  nombre = c("Ana", "Luis", "Sofia"),
  edad = c(21, 23, 20),
  nota = c(4.5, 3.8, 4.2)
)
df
##   nombre edad nota
## 1    Ana   21  4.5
## 2   Luis   23  3.8
## 3  Sofia   20  4.2
# Lista
lista <- list(numero = 5, texto = "dato", vector = v_dif)
lista
## $numero
## [1] 5
## 
## $texto
## [1] "dato"
## 
## $vector
## [1] "A"    "TRUE" "2+3i"

Para poder identificar el tipo de dato que se está manejando se puede utilizar la función class()

print(paste("Objeto tipo numérico: ", paste0("'",x_numerico,"' -"), class(x_numerico)))
## [1] "Objeto tipo numérico:  '3.14' - numeric"
print(paste("Objeto tipo matriz: ", class(m)))
## [1] "Objeto tipo matriz:  matrix" "Objeto tipo matriz:  array"
print(paste("Objeto tipo data frame: ", class(df)))
## [1] "Objeto tipo data frame:  data.frame"
print(paste("Objeto tipo lógico: ", paste0("'",x_logico,"' -"), class(x_logico)))
## [1] "Objeto tipo lógico:  'TRUE' - logical"
print(paste("Objeto tipo lista: ", class(lista)))
## [1] "Objeto tipo lista:  list"

4 Funciones

Una función tiene un nombre, argumentos y un cuerpo. Las funciones definidas por el usuario son creadas usando la sigiente estructura.

nombre <- function(argumentos) {
  operaciones
}

El nombre que asignamos a una función nos permite ejecutarla y hacer referencias a ella. Los argumentos son las variables que necesita la función para realizar sus operaciones. Aparecen entre paréntesis, separados por comas. El cuerpo de la función contiene, entre llaves, todas las operaciones que se ejecutarán cuando la función sea llamada.

4.0.1 Ejemplo 1

Se crea el algoritmo para calcular el área de un cuadrilátero:

area_cuad <- function(lado1, lado2) {
  lado1 * lado2
}
area_cuad(lado1 = 4, lado2 = 6)
## [1] 24

4.0.2 Ejemplo 2

Se crea el algoritmo para calcular el área de un prisma:

area_prisma <- function(arista1, arista2, arista3) {
  arista1 * arista2 * arista3
}
area_prisma(arista1 = 3, arista2 = 6, arista3 = 9)
## [1] 162

4.0.3 Ejemplo 3

Se crea el algoritmo para calcular el área de un prisma, usando la función para calcular el área de un cuadrado:

area_prisma <- function(arista1, arista2, arista3) {
  area_cuad(arista1, arista2) * arista3
}
area_prisma(3, 6, 9)
## [1] 162

4.0.4 Ejemplo 4

Se crea una función para graficar un histograma, acompañado de un título, nombres en los ejes, la media, mediana y desviación estándar de los datos.

crear_histograma <- function(datos, nombre) {
  media <- mean(datos)
  desv_est <- sd(datos)
  mediana <- median(datos)
  
  hist(datos, main = nombre, xlab = "Datos", ylab = "Frecuencia", col = "orange")
  abline(v = media, col = "red")
  abline(v = media + (desv_est * c(1, -1)), col = "blue")
  abline(v = mediana, col = "green")
}

Se generan datos de ingreso, con una media igual a 15000 y una desviación estándar de 4500.

ingreso <- rnorm(1500, mean = 15000, sd = 4500)
crear_histograma(ingreso, "Ingreso")

5 Estructuras de control

Las estructuras de control más usadas en R son las siguientes.

Estructura de control Descripción
if, else Si, de otro modo
for Para cada uno en
while Mientras
break Interrupción
next Siguiente

5.1 If, else

El modelo para un if es:

if(Condición) {
  operaciones_si_la_condición_es_verdadera
}

Si la condición se cumple, entonces se realizan las operaciones. En caso contrario, no ocurre nada y el código con las operaciones no es ejecutado.

5.1.1 Ejemplo 1

# Se cumple la condición y se muestra "verdadero"
if(4 > 3) {
  "Verdadero"
}
## [1] "Verdadero"

5.1.2 Ejemplo 2

# No se cumple la condición y no pasa nada
if(4 > 5) {
  "Verdadero"
}

El modelo para un if con un else es:

if(condición) {
  operaciones_si_la_condición_es_TRUE
} else {
  operaciones_si_la_condición_es_FALSE
}

5.1.3 Ejemplo 3

# Se cumple la condición y se muestra "Verdadero"
if(4 > 3) {
  "Verdadero"
} else {
  "Falso"
}
## [1] "Verdadero"

5.1.4 Ejemplo 4

# No se cumple la condición y se muestra "Falso"
if(4 > 5) {
  "Verdadero"
} else {
  "Falso"
}
## [1] "Falso"

5.1.5 EJemplo 5

Se crea una función que calcula el promedio de calificaciones de un estudiante y, dependiendo de la calificación calculada, devuleve un mensaje específico.

promedio <- function(calificaciones) {
  media <- mean(calificaciones)
  texto <- paste0("Calificación: ", media, ", ")
  
  if(media >= 6) {
    print(paste0(texto, "aprobado"))
  } else {
    print(paste0(texto, "reprobado"))
  }
}
promedio(c(6, 7, 8, 9, 8))
## [1] "Calificación: 7.6, aprobado"
promedio(c(5, 8, 5, 6, 5))
## [1] "Calificación: 5.8, reprobado"

La función ifelse() nos permite vectorizar if, else. Esta función tiene la siguiente forma:

ifelse(vector, valor_si_TRUE, valor_si_FALSE)

5.1.6 Ejemplo 6

Se revisa si los números en un vector son pares o impares.

num <- 1:8

ifelse(num %% 2 == 0, "Par", "Impar")
## [1] "Impar" "Par"   "Impar" "Par"   "Impar" "Par"   "Impar" "Par"

5.1.7 Ejemplo 7

Se recodifican datos, donde el número 0 es la categoría Hombre y el número 1 es la categoría Mujer.

num <- c(0, 1, 0, 0, 0, 1, 1)
num <- ifelse(num == 0, "Hombre", "Mujer")
num
## [1] "Hombre" "Mujer"  "Hombre" "Hombre" "Hombre" "Mujer"  "Mujer"

5.2 For

La estructura for permite ejecutar un bucle, realizando una operación para cada elemento de un conjunto de datos. Su estructura es la siguiente:

for(elemento in objeto) {
  operacion_con_elemento
}

5.2.1 Ejemplo 8

Se obtiene el cuadrado de cada uno de los elementos en un vector numérico del 1 al 6, que representa las caras de un dado.

dado <- 1:6

for(cara in dado) {
  print(cara ^ 2) 
}
## [1] 1
## [1] 4
## [1] 9
## [1] 16
## [1] 25
## [1] 36

5.2.2 Ejemplo 9

Se identifica si los números del 1 al 10 son pares o impares.

for (i in 1:10) {
  if (i %% 2 == 0) {
    print(paste(i, "es par"))
  } else {
    print(paste(i, "es impar"))
  }
}
## [1] "1 es impar"
## [1] "2 es par"
## [1] "3 es impar"
## [1] "4 es par"
## [1] "5 es impar"
## [1] "6 es par"
## [1] "7 es impar"
## [1] "8 es par"
## [1] "9 es impar"
## [1] "10 es par"

5.3 While

Este es un tipo de bucle que ocurre mientras una condición es verdadera (TRUE). El modelo de while es:

while(condicion) {
  operaciones
}

5.3.1 Ejemplo 10

Se suma +1 a un valor, mientras que este sea menor que 5.

umbral <- 5
valor <- 0

while(valor < umbral) {
  print("Todavía no.")
  valor <- valor + 1
}
## [1] "Todavía no."
## [1] "Todavía no."
## [1] "Todavía no."
## [1] "Todavía no."
## [1] "Todavía no."
valor
## [1] 5

5.3.2 Ejemplo 11

Se suman calificaciones, del 1 al 10 al azar, hasta llegar a un número mayor o igual a 50. Además, se desea saber cuántas calificaciones sumaron y cuál fue el resultado al momento de cumplir la condición.

conteo <-  0
valor <- 0
while(valor < 50) {
  valor <- valor + sample(x = 1:10, size = 1)
  conteo <- conteo + 1
}
conteo
## [1] 11
valor
## [1] 58

5.4 Break y next

break nos permite interrumpir un bucle, mientras que next nos deja avanzar a la siguiente iteración del bucle.

5.4.1 Ejemplo 12

Se interrumpe un for cuando i es igual a 3.

for(i in 1:10) {
  if(i == 3) {
    break
  }
  print(i)
}
## [1] 1
## [1] 2

5.4.2 EJemplo 13

Se salta la iteración i=3 cuando esta se cumple.

for(i in 1:4) {
  if(i == 3) {
    next
  }
  print(i)
}
## [1] 1
## [1] 2
## [1] 4

6 La familia apply

La familia de funciones apply es usada para aplicar una función a cada elemento de una estructura de datos. En particular, es usada para aplicar funciones en matrices, data frames, arrays y listas. Está conformada por las siguientes funciones:

  • apply()
  • eapply()
  • lapply()
  • mapply()
  • rapply()
  • sapply()
  • tapply()
  • vapply()

Todas las funciones de esta familia reciben como argumentos a un objeto y al menos una función.

6.1 Apply

apply aplica una función a todos los elementos de una matriz. La estructura de esta función es la siguiente.

apply(X, MARGIN, FUN)

donde X es una matriz o un data frame, MARGIN es la dimensión que agrupa los elementos de X (1 si son filas, 2 si son columnas, y FUNes la función a aplicar.

6.1.1 Ejemplo 1

Se suman los elementos de una matriz por filas.

matriz <- matrix(1:16, nrow = 4) 
matriz
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9   13
## [2,]    2    6   10   14
## [3,]    3    7   11   15
## [4,]    4    8   12   16
apply(X = matriz, MARGIN = 1, FUN = sum)
## [1] 28 32 36 40

6.1.2 Ejemplo 2

Se suman los elementos de una matriz por columnas.

matriz <- matrix(1:16, nrow = 4) 
matriz
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9   13
## [2,]    2    6   10   14
## [3,]    3    7   11   15
## [4,]    4    8   12   16
y<-apply(X = matriz, MARGIN = 2, FUN = sum)
y
## [1] 10 26 42 58
class(y)
## [1] "integer"

6.1.3 Ejemplo 3

Se hacen estadísticas descriptivas a una matriz por filas

apply(matriz, 1, mean) # Media
## [1]  7  8  9 10
apply(matriz, 1, FUN = sd) # Desviación estándar
## [1] 5.163978 5.163978 5.163978 5.163978
apply(matriz, 1, FUN = max) # Máximo
## [1] 13 14 15 16
apply(matriz, 1, FUN = quantile) # Cuantiles
##      [,1] [,2] [,3] [,4]
## 0%      1    2    3    4
## 25%     4    5    6    7
## 50%     7    8    9   10
## 75%    10   11   12   13
## 100%   13   14   15   16

6.2 Lapply

lapply() es un caso especial de apply(), diseñado para aplicar funciones a todos los elementos de una lista. La estructura de esta función es:

lapply(X, FUN)

donde X es una lista, y FUN es una función a aplicar.

6.2.1 Ejemplo 4

Se obtiene la matriz de correlación de 3 data frames contenidos en una sola lista.

# Fijamos seed
set.seed(seed =1)

# Creamos una lista con tres data frames dentro
tablas <- list(
  df1 = data.frame(a = rnorm(n = 5), b = rnorm(n = 5), c = rnorm(n = 5)),
  df2 = data.frame(d = rnorm(n = 5), e = rnorm(n = 5), f = rnorm(n = 5)),
  df3 = data.frame(g = rnorm(n = 5), h = rnorm(n = 5), i = rnorm(n = 5))
)
lapply(X = tablas, FUN = cor)
## $df1
##            a          b          c
## a  1.0000000  0.2789049 -0.6149659
## b  0.2789049  1.0000000 -0.7864121
## c -0.6149659 -0.7864121  1.0000000
## 
## $df2
##            d          e          f
## d  1.0000000 -0.6429515 -0.5545612
## e -0.6429515  1.0000000  0.3156738
## f -0.5545612  0.3156738  1.0000000
## 
## $df3
##            g          h         i
## g  1.0000000 -0.6200860 0.4283194
## h -0.6200860  1.0000000 0.1140061
## i  0.4283194  0.1140061 1.0000000

7 Importación de datos

install.packages("readxl")
library(readxl)
help(read_excel)

7.1 Archivos con extensiones xls y xlsx

7.1.1 Ejemplo 1

Se leen los datos disponibles en la hoja número 1 del libro de Excel example.xlsx cuya primera fila contiene los nombres de las columnas

mortality_data<-read_excel("example.xlsx",sheet=1,col_names=TRUE)
class(mortality_data)
## [1] "tbl_df"     "tbl"        "data.frame"
str(mortality_data)
## tibble [10,000 × 24] (S3: tbl_df/tbl/data.frame)
##  $ age                 : chr [1:10000] "100" "66" "31" "42" ...
##  $ weight              : chr [1:10000] "219" "242" "197" "244" ...
##  $ sex                 : chr [1:10000] "m" "m" "f" "f" ...
##  $ height              : chr [1:10000] "74" "73" "65" "69" ...
##  $ sys_bp              : chr [1:10000] "136" "111" "112" "127" ...
##  $ smoker              : chr [1:10000] "n" "n" "n" "n" ...
##  $ nic_other           : chr [1:10000] "n" "n" "n" "n" ...
##  $ num_meds            : chr [1:10000] "0" "0" "7" "1" ...
##  $ occup_danger        : chr [1:10000] "1" "1" "1" "2" ...
##  $ ls_danger           : chr [1:10000] "1" "1" "2" "3" ...
##  $ cannabis            : chr [1:10000] "n" "n" "n" "n" ...
##  $ opioids             : chr [1:10000] "n" "n" "n" "n" ...
##  $ other_drugs         : chr [1:10000] "n" "n" "n" "n" ...
##  $ drinks_aweek        : chr [1:10000] "4" "6" "16" "16" ...
##  $ addiction           : chr [1:10000] "n" "y" "y" "n" ...
##  $ major_surgery_num   : chr [1:10000] "0" "0" "3" "2" ...
##  $ diabetes            : chr [1:10000] "n" "n" "n" "n" ...
##  $ hds                 : chr [1:10000] "y" "n" "y" "y" ...
##  $ cholesterol         : chr [1:10000] "203" "228" "183" "228" ...
##  $ asthma              : chr [1:10000] "n" "n" "n" "n" ...
##  $ immune_defic        : chr [1:10000] "n" "n" "n" "n" ...
##  $ family_cancer       : chr [1:10000] "y" "n" "n" "n" ...
##  $ family_heart_disease: chr [1:10000] "n" "n" "n" "n" ...
##  $ family_cholesterol  : chr [1:10000] "y" "n" "n" "n" ...
head(mortality_data,n=3)
## # A tibble: 3 × 24
##   age   weight sex   height sys_bp smoker nic_other num_meds occup_danger
##   <chr> <chr>  <chr> <chr>  <chr>  <chr>  <chr>     <chr>    <chr>       
## 1 100   219    m     74     136    n      n         0        1           
## 2 66    242    m     73     111    n      n         0        1           
## 3 31    197    f     65     112    n      n         7        1           
## # ℹ 15 more variables: ls_danger <chr>, cannabis <chr>, opioids <chr>,
## #   other_drugs <chr>, drinks_aweek <chr>, addiction <chr>,
## #   major_surgery_num <chr>, diabetes <chr>, hds <chr>, cholesterol <chr>,
## #   asthma <chr>, immune_defic <chr>, family_cancer <chr>,
## #   family_heart_disease <chr>, family_cholesterol <chr>
tail(mortality_data,n=3)
## # A tibble: 3 × 24
##   age   weight sex   height sys_bp smoker nic_other num_meds occup_danger
##   <chr> <chr>  <chr> <chr>  <chr>  <chr>  <chr>     <chr>    <chr>       
## 1 42    207    f     60     127    y      n         0        3           
## 2 84    186    f     66     137    n      n         4        1           
## 3 25    190    m     69     111    n      n         10       2           
## # ℹ 15 more variables: ls_danger <chr>, cannabis <chr>, opioids <chr>,
## #   other_drugs <chr>, drinks_aweek <chr>, addiction <chr>,
## #   major_surgery_num <chr>, diabetes <chr>, hds <chr>, cholesterol <chr>,
## #   asthma <chr>, immune_defic <chr>, family_cancer <chr>,
## #   family_heart_disease <chr>, family_cholesterol <chr>
colnames(mortality_data)
##  [1] "age"                  "weight"               "sex"                 
##  [4] "height"               "sys_bp"               "smoker"              
##  [7] "nic_other"            "num_meds"             "occup_danger"        
## [10] "ls_danger"            "cannabis"             "opioids"             
## [13] "other_drugs"          "drinks_aweek"         "addiction"           
## [16] "major_surgery_num"    "diabetes"             "hds"                 
## [19] "cholesterol"          "asthma"               "immune_defic"        
## [22] "family_cancer"        "family_heart_disease" "family_cholesterol"
dim(mortality_data)
## [1] 10000    24
ncol(mortality_data)
## [1] 24
nrow(mortality_data)
## [1] 10000

7.1.2 Ejemplo 2

Se leen los datos en las columnas “A” a la “E” de la hoja Attributes del libro de Excel example.xlsx.

mortality_data2 <- read_excel("example.xlsx",sheet="Attributes",col_names=TRUE,range=cell_cols("A:E"))
str(mortality_data2)
## tibble [10,000 × 5] (S3: tbl_df/tbl/data.frame)
##  $ age   : chr [1:10000] "100" "66" "31" "42" ...
##  $ weight: chr [1:10000] "219" "242" "197" "244" ...
##  $ sex   : chr [1:10000] "m" "m" "f" "f" ...
##  $ height: chr [1:10000] "74" "73" "65" "69" ...
##  $ sys_bp: chr [1:10000] "136" "111" "112" "127" ...

7.1.3 Ejemplo 3

Se leen los datos en las columnas “A” a la “E” de la hoja Attributes del libro de Excel example.xlsx.

mortality_data3 <- read_excel("example.xlsx",sheet="Attributes",col_names=TRUE,range=cell_cols(1:5))
str(mortality_data3)
## tibble [10,000 × 5] (S3: tbl_df/tbl/data.frame)
##  $ age   : chr [1:10000] "100" "66" "31" "42" ...
##  $ weight: chr [1:10000] "219" "242" "197" "244" ...
##  $ sex   : chr [1:10000] "m" "m" "f" "f" ...
##  $ height: chr [1:10000] "74" "73" "65" "69" ...
##  $ sys_bp: chr [1:10000] "136" "111" "112" "127" ...

7.1.4 Ejemplo 4

Se leen los datos de las filas 2 a la 20 de la hoja Attributes del libro de Excel example.xlsx.

mortality_data4 <- read_excel("example.xlsx",sheet="Attributes",col_names=TRUE,range=cell_rows(1:20))
dim(mortality_data4)
## [1] 19 24

7.1.5 Ejemplo 5

Se leen los datos en el rango “A1:E20” de la hoja Attributes del libro de Excel example.xlsx.

mortality_data5 <- read_excel("example.xlsx",sheet="Attributes",col_names=TRUE,range="A1:E20")
str(mortality_data5)
## tibble [19 × 5] (S3: tbl_df/tbl/data.frame)
##  $ age   : chr [1:19] "100" "66" "31" "42" ...
##  $ weight: chr [1:19] "219" "242" "197" "244" ...
##  $ sex   : chr [1:19] "m" "m" "f" "f" ...
##  $ height: chr [1:19] "74" "73" "65" "69" ...
##  $ sys_bp: chr [1:19] "136" "111" "112" "127" ...

7.1.6 Ejemplo 6

Se leen solo las primeras 35 filas de datos en la hoja Attributes del libro de Excel example.xlsx.

mortality_data6 <- read_excel("example.xlsx",sheet="Attributes",col_names=TRUE,n_max=35)
dim(mortality_data6)
## [1] 35 24

7.1.7 Ejemplo 7

Se leen los datos en las columnas “A” a la “D” de la hoja Attributes del libro de Excel example.xls, dándole nombres personalizados a las columnas.

mortality_data7 <- read_excel("example.xlsx",sheet="Attributes",range=cell_cols(1:4))
colnames(mortality_data7) <- c("Edad", "Peso", "Sexo", "Altura")
str(mortality_data7)
## tibble [10,000 × 4] (S3: tbl_df/tbl/data.frame)
##  $ Edad  : chr [1:10000] "100" "66" "31" "42" ...
##  $ Peso  : chr [1:10000] "219" "242" "197" "244" ...
##  $ Sexo  : chr [1:10000] "m" "m" "f" "f" ...
##  $ Altura: chr [1:10000] "74" "73" "65" "69" ...

7.1.8 Ejemplo 8

Se leen los datos en las columnas “A” a la “D” de la hoja Attributes del libro de Excel example.xls, dándole nombres personalizados a las columnas y leyendo estas últimas con formatos numeric,numeric,text,numeric, respectivamente.

mortality_data8 <- read_excel("example.xlsx",sheet="Attributes",range=cell_cols(1:4))
colnames(mortality_data8) <- c("Edad", "Peso", "Sexo", "Altura")
mortality_data8$Edad   <- as.numeric(mortality_data8$Edad)
mortality_data8$Peso   <- as.numeric(mortality_data8$Peso)
mortality_data8$Altura <- as.numeric(mortality_data8$Altura)

str(mortality_data8)
## tibble [10,000 × 4] (S3: tbl_df/tbl/data.frame)
##  $ Edad  : num [1:10000] 100 66 31 42 93 66 84 83 97 45 ...
##  $ Peso  : num [1:10000] 219 242 197 244 183 230 220 199 160 200 ...
##  $ Sexo  : chr [1:10000] "m" "m" "f" "f" ...
##  $ Altura: num [1:10000] 74 73 65 69 63 69 63 66 65 62 ...

7.2 Archivos con extensiones txt, csv, tsv, dlm y dat

7.3 Archivos delimitados

install.packages("readr")
library(readr)
help(read_delim)

7.3.1 Ejemplo 9

Se leen los datos en el archivo stocks.dlm, que está localizado en la libreria de trabajo, los datos están separados por ” “, y la primera fila contiene los nombres de las columnas.

stocks1 <- read_delim("stocks.dlm",delim=" ",col_names=TRUE)
str(stocks1)

7.3.2 Ejemplo 10

Se leen los datos en el archivo stocks.dlm especificando que el separador decimal es “,” y el separador de agrupamiento es “.”.

stocks2 <- read_delim("stocks.dlm",delim=" ",col_names=TRUE,
                      locale=locale(decimal_mark=",",grouping_mark="."))
str(stocks2)

7.3.3 Ejemplo 11

Se leen los datos en el archivo stocks.dlm especificando el formato en el que se deben leer las columnas.

help(cols)
stocks3 <- read_delim("stocks.dlm",delim=" ",col_names=TRUE,
                      locale=locale(decimal_mark=",",grouping_mark="."),
                      col_types=cols("f","D","d","d","d","d","n","d"))
str(stocks3)

7.3.4 Ejemplo 12

Se leen los datos en el archivo stocks.dlm especificando el formato con el que se deben leer las columnas. En particular, se especifica el formato como se debe leer la fecha de la que consta la columna en la posición 2.

help(strptime)
stocks4 <- read_delim("stocks.dlm",delim=" ",col_names=TRUE,
                      locale=locale(decimal_mark=",",grouping_mark="."),
                      col_types=cols("f",col_date("%d%b%y"),"d","d","d","d","n","d"))
str(stocks4)

7.3.5 Ejemplo 13

Se leen los datos en el archivo stocks.dlm personalizando los nombres de las columnas.

stocks5 <- read_delim("stocks.dlm",delim=" ",
                      locale=locale(decimal_mark=",",grouping_mark="."),
                      col_types=cols("f",col_date("%d%b%y"),"d","d","d","d","n","d"),skip=1,
                      col_names=c("Stock","Fecha","Open","High","Low","Close","Volumen","AdjClose"))
str(stocks5)

7.3.6 Ejemplo 14

Se leen solo las primeras 4 filas de datos en el archivo stocks.dlm.

stocks6 <- read_delim("stocks.dlm",delim=" ",n_max=4,
                      locale=locale(decimal_mark=",",grouping_mark="."),
                      col_types=cols("f",col_date("%d%b%y"),"d","d","d","d","n","d"),skip=1,
                      col_names=c("Stock","Fecha","Open","High","Low","Close","Volumen","AdjClose"))
str(stocks6)

7.3.7 Ejemplo 15

Se leen los datos en el archivo stocks.dlm especificando el formato con el que se deben leer las columnas. El formato de la columna en la posición 3 se especifica a partir de la inspección de los datos, y las columnas en las posiciones 7 y 8 se excluyen.

stocks7 <- read_delim("stocks.dlm",delim=" ",
                      locale=locale(decimal_mark=",",grouping_mark="."),
                      col_types=cols("f",col_date("%d%b%y"),"?","d","d","d","-","-"),
                      skip=1,col_names=c("Stock","Date","Open","High","Low","Close"))
str(stocks7)

8 Exportación de datos

8.1 Ejemplo 1

Guardar el conjunto de datos mortality_data en el directorio de trabajo.

8.1.1 R Data File

saveRDS(mortality_data, file="mortality_data.RDS")
mortality_data<-readRDS("mortality_data.RDS")
head(mortality_data,5)
## # A tibble: 5 × 24
##   age   weight sex   height sys_bp smoker nic_other num_meds occup_danger
##   <chr> <chr>  <chr> <chr>  <chr>  <chr>  <chr>     <chr>    <chr>       
## 1 100   219    m     74     136    n      n         0        1           
## 2 66    242    m     73     111    n      n         0        1           
## 3 31    197    f     65     112    n      n         7        1           
## 4 42    244    f     69     127    n      n         1        2           
## 5 93    183    f     63     91     y      n         2        3           
## # ℹ 15 more variables: ls_danger <chr>, cannabis <chr>, opioids <chr>,
## #   other_drugs <chr>, drinks_aweek <chr>, addiction <chr>,
## #   major_surgery_num <chr>, diabetes <chr>, hds <chr>, cholesterol <chr>,
## #   asthma <chr>, immune_defic <chr>, family_cancer <chr>,
## #   family_heart_disease <chr>, family_cholesterol <chr>

8.1.2 csv (Comma Separated Values)

write_csv(mortality_data, "mortality_data.csv")
mortality_data<-read.csv("mortality_data.csv")
head(mortality_data,5)
##   age weight sex height sys_bp smoker nic_other num_meds occup_danger ls_danger
## 1 100    219   m     74    136      n         n        0            1         1
## 2  66    242   m     73    111      n         n        0            1         1
## 3  31    197   f     65    112      n         n        7            1         2
## 4  42    244   f     69    127      n         n        1            2         3
## 5  93    183   f     63     91      y         n        2            3         3
##   cannabis opioids other_drugs drinks_aweek addiction major_surgery_num
## 1        n       n           n            4         n                 0
## 2        n       n           n            6         y                 0
## 3        n       n           n           16         y                 3
## 4        n       n           n           16         n                 2
## 5        n       n           n           26         y                 2
##   diabetes hds cholesterol asthma immune_defic family_cancer
## 1        n   y         203      n            n             y
## 2        n   n         228      n            n             n
## 3        n   y         183      n            n             n
## 4        n   y         228      n            n             n
## 5        n   n         169      n            n             n
##   family_heart_disease family_cholesterol
## 1                    n                  y
## 2                    n                  n
## 3                    n                  n
## 4                    n                  n
## 5                    n                  n

8.1.3 tsv (Tabular Separated Values)

write_tsv(mortality_data, "mortality_data.tsv")
mortality_data<-read_tsv("mortality_data.tsv")
head(mortality_data,5)
## # A tibble: 5 × 24
##     age weight sex   height sys_bp smoker nic_other num_meds occup_danger
##   <dbl>  <dbl> <chr>  <dbl>  <dbl> <chr>  <chr>        <dbl>        <dbl>
## 1   100    219 m         74    136 n      n                0            1
## 2    66    242 m         73    111 n      n                0            1
## 3    31    197 f         65    112 n      n                7            1
## 4    42    244 f         69    127 n      n                1            2
## 5    93    183 f         63     91 y      n                2            3
## # ℹ 15 more variables: ls_danger <dbl>, cannabis <chr>, opioids <chr>,
## #   other_drugs <chr>, drinks_aweek <dbl>, addiction <chr>,
## #   major_surgery_num <dbl>, diabetes <chr>, hds <chr>, cholesterol <dbl>,
## #   asthma <chr>, immune_defic <chr>, family_cancer <chr>,
## #   family_heart_disease <chr>, family_cholesterol <chr>

8.1.4 Text File

write_delim(mortality_data, "mortality_data.txt", delim="\t")
mortality_data<-read.delim("mortality_data.txt")
head(mortality_data,5)
##   age weight sex height sys_bp smoker nic_other num_meds occup_danger ls_danger
## 1 100    219   m     74    136      n         n        0            1         1
## 2  66    242   m     73    111      n         n        0            1         1
## 3  31    197   f     65    112      n         n        7            1         2
## 4  42    244   f     69    127      n         n        1            2         3
## 5  93    183   f     63     91      y         n        2            3         3
##   cannabis opioids other_drugs drinks_aweek addiction major_surgery_num
## 1        n       n           n            4         n                 0
## 2        n       n           n            6         y                 0
## 3        n       n           n           16         y                 3
## 4        n       n           n           16         n                 2
## 5        n       n           n           26         y                 2
##   diabetes hds cholesterol asthma immune_defic family_cancer
## 1        n   y         203      n            n             y
## 2        n   n         228      n            n             n
## 3        n   y         183      n            n             n
## 4        n   y         228      n            n             n
## 5        n   n         169      n            n             n
##   family_heart_disease family_cholesterol
## 1                    n                  y
## 2                    n                  n
## 3                    n                  n
## 4                    n                  n
## 5                    n                  n

9 Creación y modificación de variables (limpieza de datos)

data(LifeCycleSavings)
data(LifeCycleSavings)
head(LifeCycleSavings)
##              sr pop15 pop75     dpi ddpi
## Australia 11.43 29.35  2.87 2329.68 2.87
## Austria   12.07 23.32  4.41 1507.99 3.93
## Belgium   13.17 23.80  4.43 2108.47 3.82
## Bolivia    5.75 41.89  1.67  189.13 0.22
## Brazil    12.88 42.19  0.83  728.47 4.56
## Canada     8.79 31.72  2.85 2982.88 2.43

Para acceder a las columnas de un data frame se puede hacer llamando el nombre de la columna mediante en operador $ o considerando el data frame como una matriz y seleccionando el número de columna de interés.

9.0.1 Ejemplo 1

# Acceder a columnas
LifeCycleSavings$sr
##  [1] 11.43 12.07 13.17  5.75 12.88  8.79  0.60 11.90  4.98 10.78 16.85  3.59
## [13] 11.24 12.64 12.55 10.67  3.01  7.70  1.27  9.00 11.34 14.28 21.10  3.98
## [25] 10.35 15.48 10.25 14.65 10.67  7.30  4.44  2.02 12.70 12.78 12.49 11.14
## [37] 13.30 11.77  6.86 14.13  5.13  2.81  7.81  7.56  9.22 18.56  7.72  9.24
## [49]  8.89  4.71
LifeCycleSavings[,"sr"]
##  [1] 11.43 12.07 13.17  5.75 12.88  8.79  0.60 11.90  4.98 10.78 16.85  3.59
## [13] 11.24 12.64 12.55 10.67  3.01  7.70  1.27  9.00 11.34 14.28 21.10  3.98
## [25] 10.35 15.48 10.25 14.65 10.67  7.30  4.44  2.02 12.70 12.78 12.49 11.14
## [37] 13.30 11.77  6.86 14.13  5.13  2.81  7.81  7.56  9.22 18.56  7.72  9.24
## [49]  8.89  4.71

Para manejo de variables de texto se pueden utilizar las siguientes funciones.

install.packages("stringr")
library(stringr)
help(stringr)
help(str_to_lower) # convierte todas las letras a minúsculas
help(str_replace_all) # reemplaza todo el texto especificado por otro
help(str_squish) # remueve espacios en blanco
help(str_to_title) # la primera letra de cada palabra la pone en mayúsculas  

Para operar entre columnas se pueden utilizar los siguientes operadores

9.1 Operadores aritméticos

Operador Significado
+ Suma
- Resta
* Multiplicación
/ División
^ Potenciación
%% Residuo de la división

9.2 Operadores de comparación

Operador Significado
< Es menor que
> Es mayor que
<= Es menor o igual que
>= Es mayor o igual que
== Es igual a
!= Es diferente a

9.3 Operadores lógicos

Operador Significado
| Unión (o)
& Intersección (y)
! Negación

Para crear nuevas columnas en el Data Frame se puede poner el nombre de la columna mediante el operador $ y asignarle un objeto de tipo vector.

9.3.1 Ejemplo 2

# Agregar columna nueva
LifeCycleSavings$pop15_mayor_40 <- LifeCycleSavings$pop15>40
LifeCycleSavings$pop15_mayor_40
##  [1] FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
## [13] FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE
## [25] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
## [37] FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE FALSE
## [49]  TRUE  TRUE

Para hacer subconjuntos de un Data Frame se puede utilizar la función subset(df, condición) la cual acepta como entradas el data frame y una condición que filtre las filas del Data Frame.

9.3.2 Ejemplo 3

# Filtrar y ordenar
subset_LifeCycleSavings = subset(LifeCycleSavings, LifeCycleSavings$pop15_mayor_40==TRUE)
dim(subset_LifeCycleSavings)
## [1] 22  6
head(subset_LifeCycleSavings)
##               sr pop15 pop75    dpi ddpi pop15_mayor_40
## Bolivia     5.75 41.89  1.67 189.13 0.22           TRUE
## Brazil     12.88 42.19  0.83 728.47 4.56           TRUE
## China      11.90 44.75  0.67 289.52 6.51           TRUE
## Colombia    4.98 46.64  1.06 276.65 3.08           TRUE
## Costa Rica 10.78 47.64  1.14 471.24 2.80           TRUE
## Ecuador     3.59 46.31  1.19 287.77 2.19           TRUE
LifeCycleSavings_ord <- LifeCycleSavings[order(LifeCycleSavings$dpi), ]

Para eliminar las filas que contienen valores vacíos o NA se utiliza la función na.omit(). Sin embargo, si se quiere reemplazar los valores NA toca filtrar el data frame a las filas y columnnas con valores vacíos y reemplazar uno por uno.

9.3.3 Ejemplo 4

# Eliminar valores NA
df <- data.frame(a = c(1, 2, NA,8), b = c(4, NA, 6,5))
df
##    a  b
## 1  1  4
## 2  2 NA
## 3 NA  6
## 4  8  5
df_sinNA <- na.omit(df)
df_sinNA
##   a b
## 1 1 4
## 4 8 5
# Reemplazar NA por un valor específico
df$b[is.na(df$b)] <- mean(df$b, na.rm = TRUE)
df
##    a b
## 1  1 4
## 2  2 5
## 3 NA 6
## 4  8 5

10 Manipulación de bases de datos

El paquete dplyr ofrece una gramática clara y coherente para la manipulación de data frames, facilitando la lectura y comprensión del código. Además, sus funciones son altamente eficientes, ya que están implementadas en C++.

Los principales verbos de esta gramática son:

Verbo Descripción
select() Selecciona columnas específicas
filter() Filtra filas según condiciones lógicas
arrange() Reordena las filas de un data frame
rename() Cambia el nombre de las variables
mutate() Crea o transforma columnas
summarise() Genera resúmenes estadísticos
%>% Operador pipe que encadena múltiples operaciones
install.packages("dplyr")
library(dplyr)

10.0.1 Ejemplo 1

Se seleccionan las variables wind y pressure de data frame storms que se encuentra en la librería devtools.

install.packages("devtools")
devtools::install_github("rstudio/EDAWR")
head(storms,3)
## # A tibble: 3 × 13
##   name   year month   day  hour   lat  long status       category  wind pressure
##   <chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct>           <dbl> <int>    <int>
## 1 Amy    1975     6    27     0  27.5   -79 tropical de…       NA    25     1013
## 2 Amy    1975     6    27     6  28.5   -79 tropical de…       NA    25     1013
## 3 Amy    1975     6    27    12  29.5   -79 tropical de…       NA    25     1013
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## #   hurricane_force_diameter <int>
head(select(storms, wind, pressure),3)
## # A tibble: 3 × 2
##    wind pressure
##   <int>    <int>
## 1    25     1013
## 2    25     1013
## 3    25     1013

10.0.2 Ejemplo 2

Se seleccionan cuyo nombre empieza con la letra “w”.

head(select(storms,starts_with("w")),3)
## # A tibble: 3 × 1
##    wind
##   <int>
## 1    25
## 2    25
## 3    25

10.0.3 Ejemplo 3

Selecciona columnas cuyo nombre termina con la letra “e”.

head(select(storms, ends_with("e")),3)
## # A tibble: 3 × 2
##   name  pressure
##   <chr>    <int>
## 1 Amy       1013
## 2 Amy       1013
## 3 Amy       1013

10.0.4 Ejemplo 4

Filtra las filas de storms que tienen el valor en la variable wind mayor o igual a 50.

str(filter(storms, wind >= 50))
## tibble [8,328 × 13] (S3: tbl_df/tbl/data.frame)
##  $ name                        : chr [1:8328] "Amy" "Amy" "Amy" "Amy" ...
##  $ year                        : num [1:8328] 1975 1975 1975 1975 1975 ...
##  $ month                       : num [1:8328] 6 6 6 6 6 7 7 7 7 7 ...
##  $ day                         : int [1:8328] 29 30 30 30 30 1 1 1 1 2 ...
##  $ hour                        : num [1:8328] 18 0 6 12 18 0 6 12 18 0 ...
##  $ lat                         : num [1:8328] 33.8 34.3 35.6 35.9 36.2 36.2 36.2 36.2 36.7 37.4 ...
##  $ long                        : num [1:8328] -72.8 -71.6 -70.8 -70.5 -70.2 -69.8 -69.4 -68.3 -67.2 -66.7 ...
##  $ status                      : Factor w/ 9 levels "disturbance",..: 8 8 8 8 8 8 8 8 8 8 ...
##  $ category                    : num [1:8328] NA NA NA NA NA NA NA NA NA NA ...
##  $ wind                        : int [1:8328] 50 50 55 60 60 60 60 60 60 60 ...
##  $ pressure                    : int [1:8328] 998 998 998 987 987 984 984 984 984 984 ...
##  $ tropicalstorm_force_diameter: int [1:8328] NA NA NA NA NA NA NA NA NA NA ...
##  $ hurricane_force_diameter    : int [1:8328] NA NA NA NA NA NA NA NA NA NA ...

10.0.5 Ejemplo 5

Filtra las filas de storms que tienen el valor en la variable wind mayor o igual a 50 y que los nombres de las personas sean “Alberto”, “Alex”, o “Allison”.

head(filter(storms, wind >= 50, name %in% c("Alberto", "Alex", "Allison")))
## # A tibble: 6 × 13
##   name     year month   day  hour   lat  long status     category  wind pressure
##   <chr>   <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct>         <dbl> <int>    <int>
## 1 Alberto  1982     6     3    12  23.2 -84.2 tropical …       NA    50      995
## 2 Alberto  1982     6     3    18  24   -83.6 hurricane         1    75      985
## 3 Alberto  1982     6     4     0  24.8 -83.4 hurricane         1    65      992
## 4 Alberto  1982     6     4     6  24.9 -84.1 tropical …       NA    55      998
## 5 Alberto  1994     7     3     6  28.8 -86.8 tropical …       NA    50      997
## 6 Alberto  1994     7     3    12  29.9 -86.7 tropical …       NA    55      993
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## #   hurricane_force_diameter <int>

10.0.6 Ejemplo 6

Se ordenan las filas del data frame storms por la variable wind de forma ascendente.

head(arrange(storms, wind))
## # A tibble: 6 × 13
##   name     year month   day  hour   lat  long status     category  wind pressure
##   <chr>   <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct>         <dbl> <int>    <int>
## 1 Bonnie   1986     6    28     6  36.5 -91.3 tropical …       NA    10     1013
## 2 Bonnie   1986     6    28    12  37.2 -90   tropical …       NA    10     1012
## 3 Charley  1986     8    13    12  30.1 -84   subtropic…       NA    10     1009
## 4 Charley  1986     8    13    18  30.8 -84   subtropic…       NA    10     1012
## 5 Charley  1986     8    14     0  31.4 -83.6 subtropic…       NA    10     1013
## 6 Charley  1986     8    14     6  32   -83.1 subtropic…       NA    10     1014
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## #   hurricane_force_diameter <int>

10.0.7 Ejemplo 7

Se ordenan las filas del data frame storms por la variable wind de forma descendente.

head(arrange(storms, desc(wind)))
## # A tibble: 6 × 13
##   name     year month   day  hour   lat  long status    category  wind pressure
##   <chr>   <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct>        <dbl> <int>    <int>
## 1 Allen    1980     8     7    18  21.8 -86.4 hurricane        5   165      899
## 2 Gilbert  1988     9    14     0  19.7 -83.8 hurricane        5   160      888
## 3 Wilma    2005    10    19    12  17.3 -82.8 hurricane        5   160      882
## 4 Dorian   2019     9     1    16  26.5 -77   hurricane        5   160      910
## 5 Dorian   2019     9     1    18  26.5 -77.1 hurricane        5   160      910
## 6 Allen    1980     8     5    12  15.9 -70.5 hurricane        5   155      932
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## #   hurricane_force_diameter <int>

10.0.8 Ejemplo 8

Se ordenan las filas del data frame storms por las variables wind y year de forma ascendente.

head(arrange(storms, wind, year))
## # A tibble: 6 × 13
##   name     year month   day  hour   lat  long status     category  wind pressure
##   <chr>   <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct>         <dbl> <int>    <int>
## 1 Bonnie   1986     6    28     6  36.5 -91.3 tropical …       NA    10     1013
## 2 Bonnie   1986     6    28    12  37.2 -90   tropical …       NA    10     1012
## 3 Charley  1986     8    13    12  30.1 -84   subtropic…       NA    10     1009
## 4 Charley  1986     8    13    18  30.8 -84   subtropic…       NA    10     1012
## 5 Charley  1986     8    14     0  31.4 -83.6 subtropic…       NA    10     1013
## 6 Charley  1986     8    14     6  32   -83.1 subtropic…       NA    10     1014
## # ℹ 2 more variables: tropicalstorm_force_diameter <int>,
## #   hurricane_force_diameter <int>

10.0.9 Ejemplo 9

Se crea una nueva varible ratio con el ratio entre las variables pressure y wind.

storms2<-select(storms, wind, pressure)
head(mutate(storms2, ratio = pressure/wind))
## # A tibble: 6 × 3
##    wind pressure ratio
##   <int>    <int> <dbl>
## 1    25     1013  40.5
## 2    25     1013  40.5
## 3    25     1013  40.5
## 4    25     1013  40.5
## 5    25     1012  40.5
## 6    25     1012  40.5

10.0.10 Ejemplo 10

Se crea la distribución de frecuencias absolutas acumuladas de la variable wind.

mutate(storms2, freq.acumulative = cumsum(wind))
## # A tibble: 19,537 × 3
##     wind pressure freq.acumulative
##    <int>    <int>            <int>
##  1    25     1013               25
##  2    25     1013               50
##  3    25     1013               75
##  4    25     1013              100
##  5    25     1012              125
##  6    25     1012              150
##  7    25     1011              175
##  8    30     1006              205
##  9    35     1004              240
## 10    40     1002              280
## # ℹ 19,527 more rows

11 Estadísticas descriptivas

Para ver las estadísticas descriptivas base (percentiles, máximo, mínimo y media) de cada columna numérica a modo de resumen se utiliza la función summary(), en el caso de columnas lógicas cuenta el número de TRUE y FALSE, y en el caso de variables categóricas cuenta el número de casos por nivel de la variable.

11.0.1 Ejemplo 1

# Usar el data frame anterior
summary(LifeCycleSavings)
##        sr             pop15           pop75            dpi         
##  Min.   : 0.600   Min.   :21.44   Min.   :0.560   Min.   :  88.94  
##  1st Qu.: 6.970   1st Qu.:26.21   1st Qu.:1.125   1st Qu.: 288.21  
##  Median :10.510   Median :32.58   Median :2.175   Median : 695.66  
##  Mean   : 9.671   Mean   :35.09   Mean   :2.293   Mean   :1106.76  
##  3rd Qu.:12.617   3rd Qu.:44.06   3rd Qu.:3.325   3rd Qu.:1795.62  
##  Max.   :21.100   Max.   :47.64   Max.   :4.700   Max.   :4001.89  
##       ddpi        pop15_mayor_40 
##  Min.   : 0.220   Mode :logical  
##  1st Qu.: 2.002   FALSE:28       
##  Median : 3.000   TRUE :22       
##  Mean   : 3.758                  
##  3rd Qu.: 4.478                  
##  Max.   :16.710

Sin embargo estas medidas no describen en su totalidad las variables del Data Frame. Otras medidas que son de utilidad son las siguientes:

# Promedio
mean(mtcars$mpg)
## [1] 20.09062
# Meidana
median(mtcars$mpg)
## [1] 19.2
# Desviación estándar
sd(mtcars$mpg)
## [1] 6.026948
# Varianza
var(mtcars$mpg)
## [1] 36.3241
# Mínimo
min(mtcars$mpg)
## [1] 10.4
# Máximo
max(mtcars$mpg)
## [1] 33.9

Para describir la relación entre dos variables las funciones de covarianza y correlación segpun los coeficientes de Pearson, Kendall y Spearman se utilizan las siguientes funciones.

# Covarianza
cov(mtcars$mpg, mtcars$disp)
## [1] -633.0972
# Correlación
cor(mtcars$mpg, mtcars$disp, method = "pearson")
## [1] -0.8475514
cor(mtcars$mpg, mtcars$disp, method = "kendall")
## [1] -0.7681311
cor(mtcars$mpg, mtcars$disp, method = "spearman")
## [1] -0.9088824

Hay gran variedad de gráficos que se pueden realizar en R, son embargo dos de los más conocidos son el histograma y el boxplot que se pueden construir tanto con el paquete base de R como con el paquete ggplot2 para una mayor personalización de los gráficos.

11.0.2 Ejemplo 2

# Histograma
hist(mtcars$hp, main = "Histograma Caballos de fuerza", col = "lightblue", xlab = "Caballos de fuerza", ylab = "Frecuancia")

# Boxplot
boxplot(mtcars$qsec, main = "Boxplot tiempo por 1/4 de milla", col = "salmon")

12 Tablas de frecuencia

mortality_data<-readRDS("mortality_data.RDS")

12.0.1 Ejemplo 1

¿Cuántas personas en la base de datos mortality_data sufren de asma?, ¿cuánto es en porcentaje esta relación?

table_asma<-table(mortality_data$asthma,dnn="Asma")
table_asma
## Asma
##    n    y 
## 9218  782
barplot(table_asma,
        main = "Frecuencia de personas con asma",
        col = c("lightblue", "salmon"),
        xlab = "Asma",
        ylab = "Frecuencia",
        border = "gray40")

prop.table(table_asma) * 100  # Porcentajes
## Asma
##     n     y 
## 92.18  7.82
pie(table_asma,
    main = "Proporción de personas con asma",
    col = c("lightblue", "salmon"))

12.0.2 Ejemplo 2

Estudiar la distribución de fumadores (smoker) según el sexo (sex) de los individuos en la base mortality_data.

tabla1 <- table(mortality_data$smoker, mortality_data$sex)
tabla1
##    
##        f    m
##   n 4034 3960
##   y 1000 1006
# Gráfico de barras
barplot(tabla1,
        beside = TRUE,
        col = c("lightblue", "salmon"),
        main = "Fumadores según el sexo",
        xlab = "Sexo",
        ylab = "Número de personas")

legend("topright",
       legend = c("No fuma", "Fuma"),
       fill = c("lightblue", "salmon"))

tabla_total <- addmargins(tabla1)
tabla_total
##      
##           f     m   Sum
##   n    4034  3960  7994
##   y    1000  1006  2006
##   Sum  5034  4966 10000

12.0.3 Ejemplo 3

Estudiar la proporción de fumadores (smoker) según el sexo (sex) de los individuos en la base mortality_data.

# Porcentajes sobre el total
prop.table(tabla1)
##    
##          f      m
##   n 0.4034 0.3960
##   y 0.1000 0.1006
# Porcentajes por filas (dentro de cada grupo de fumadores)
prop.table(tabla1, margin = 1)
##    
##             f         m
##   n 0.5046285 0.4953715
##   y 0.4985045 0.5014955
# Porcentajes por columnas (dentro de cada sexo)
prop.table(tabla1, margin = 2)
##    
##             f         m
##   n 0.8013508 0.7974225
##   y 0.1986492 0.2025775

12.0.4 Ejemplo 4

Frecuencia conjunta de 3 variables (asma, antecedentes familiares de colesterol y sexo).

ftable(mortality_data$asthma, mortality_data$family_cholesterol, mortality_data$sex)
##         f    m
##               
## n n  3775 3763
##   y   857  823
## y n   311  311
##   y    91   69

13 Probabilidad

13.0.1 Ejemplo 1

Sea X una variable aleatoria con distribución binomial \(X \sim \text{Binomial}(n=10, p=0.5)\). Hallar:

  • La probabilidad de obtener exactamente 3 éxitos.
  • La probabilidad acumulada hasta 3 éxitos.
  • El cuantil 95% de la distribución.
  • Una muestra aleatoria de tamaño 10.
# ---------------------------
# Distribución Binomial
# ---------------------------
x <- 0:10
dbinom(x = 3, size = 10, prob = 0.5)   # P(X=3)
## [1] 0.1171875
pbinom(q = 3, size = 10, prob = 0.5)   # P(X < 3)
## [1] 0.171875
qbinom(p = 0.95, size = 10, prob = 0.5) # Cuantil 95%
## [1] 8
rbinom(n = 10, size = 10, prob = 0.5)   # Muestra aleatoria
##  [1] 4 3 6 7 6 6 5 5 6 5

13.0.2 Ejemplo 2

Sea X una variable aleatoria con distribución Poisson \(X \sim \text{Poisson}(\lambda=2)\). Hallar:

  • La probabilidad de que ocurran exactamente 3 eventos.
  • La probabilidad acumulada hasta 3 eventos.
  • El cuantil 95% de la distribución.
  • Una muestra aleatoria de tamaño 10.
# ---------------------------
# Distribución Poisson
# ---------------------------
x <- 0:10
dpois(x = 3, lambda = 2)    # P(X=3)
## [1] 0.180447
ppois(q = 3, lambda = 2)    # P(X < 3)
## [1] 0.8571235
qpois(p = 0.95, lambda = 2) # Cuantil 95%
## [1] 5
rpois(n = 10, lambda = 2)   # Muestra aleatoria
##  [1] 2 1 1 6 2 1 0 2 4 2

13.0.3 Ejemplo 3

Sea X una variable aleatoria con distribución Normal \(X \sim \text{Normal}(\mu=0, \sigma=1)\). Hallar:

  • La probabilidad de que \(X\) tome un valor menor o igual a 1.96.
  • La probabilidad de que \(X\) tome un valor mayor a 1.96.
  • Una muestra aleatoria de tamaño 10.
# ---------------------------
# Distribución Normal
# ---------------------------
x <- seq(-4, 4, by = 0.1)
y <- dnorm(x, mean = 0, sd = 1)
plot(x, y, type = "l", main = "Distribución Normal N(0,1)")

pnorm(1.96, mean = 0, sd = 1)   # P(Z < 1.96)
## [1] 0.9750021
1 - pnorm(1.96)                 # P(Z > 1.96)
## [1] 0.0249979
rnorm(10, mean = 0, sd = 1)     # Muestra aleatoria
##  [1]  1.98039990 -0.36722148 -1.04413463  0.56971963 -0.13505460  2.40161776
##  [7] -0.03924000  0.68973936  0.02800216 -0.74327321

13.0.4 Ejemplo 4

Sea X una variable aleatoria con distribución Uniforme \(X \sim \text{Uniforme}(a=0, b=1)\). Hallar:

  • La probabilidad de que \(X\) sea igual a 0.5.
  • La probabilidad de que \(X\) sea menor o igual a 0.5.
  • El cuantil 25% de la distribución.
  • Una muestra aleatoria de tamaño 10.
# ---------------------------
# Distribución Uniforme
# ---------------------------

dunif(x = 0.5, min = 0, max = 1)
## [1] 1
punif(q = 0.5, min = 0, max = 1)
## [1] 0.5
qunif(p = 0.25, min = 0, max = 1)
## [1] 0.25
runif(n = 10, min = 0, max = 1)
##  [1] 0.57487220 0.07706438 0.03554058 0.64279549 0.92861520 0.59809242
##  [7] 0.56090075 0.52602772 0.98509522 0.50764182

13.0.5 Ejemplo 5

Sea X una variable aleatoria con distribución Exponencial \(X \sim \text{Exponencial}(\lambda=0.5)\). Hallar:

  • La probabilidad de que \(X\) sea igual a 2.
  • La probabilidad acumulada hasta 2.
  • El cuantil 90% de la distribución.
  • Una muestra aleatoria de tamaño 10.
# ---------------------------
# Distribución Exponencial
# ---------------------------
dexp(x = 2, rate = 0.5)
## [1] 0.1839397
pexp(q = 2, rate = 0.5)
## [1] 0.6321206
qexp(p = 0.9, rate = 0.5)
## [1] 4.60517
rexp(n = 10, rate = 0.5)
##  [1] 0.7311523 0.4061649 3.1304827 1.6290716 5.5184876 0.7723871 2.0165129
##  [8] 1.6370284 0.1185224 4.5677069

13.0.6 Ejemplo 6

Sea X una variable aleatoria con distribución t de Student \(X \sim t(\nu=10)\). Hallar:

  • La probabilidad de que \(X\) sea igual a 2.
  • La probabilidad de que \(X\) sea menor o igual a 2.
  • El cuantil 97.5% de la distribución.
  • Una muestra aleatoria de tamaño 10.
# ---------------------------
# Distribución t de Student
# ---------------------------
dt(x = 2, df = 10)
## [1] 0.06114577
pt(q = 2, df = 10)
## [1] 0.963306
qt(p = 0.975, df = 10)
## [1] 2.228139
rt(n = 10, df = 10)
##  [1] -0.7175933  0.8583190  0.5805169  1.2071548  0.5218405 -0.9186865
##  [7] -0.8141062  0.1351845 -0.8494689  1.0088626

13.0.7 Ejemplo 7

Sea X una variable aleatoria con distribución Chi-cuadrado \(X \sim \chi^2(k=5)\). Hallar:

  • La probabilidad de que \(X\) sea igual a 4.
  • La probabilidad acumulada hasta 4.
  • El cuantil 95% de la distribución.
  • Una muestra aleatoria de tamaño 10.
# ---------------------------
# Distribución Chi-cuadrado
# ---------------------------
dchisq(x = 4, df = 5)
## [1] 0.1439759
pchisq(q = 4, df = 5)
## [1] 0.450584
qchisq(p = 0.95, df = 5)
## [1] 11.0705
rchisq(n = 10, df = 5)
##  [1]  1.838414  1.441672 10.560295  6.283990  6.988570  5.160439 10.172771
##  [8]  2.403946  4.072116  4.078089

13.0.8 Ejemplo 8

Sea X una variable aleatoria con distribución Gamma \(X \sim \text{Gamma}(\alpha=3, \beta=1)\). Hallar:

  • La probabilidad de que \(X\) sea igual a 2.
  • La probabilidad acumulada hasta 2.
  • El cuantil 95% de la distribución.
  • Una muestra aleatoria de tamaño 10.
# ---------------------------
# Distribución Gamma
# ---------------------------
dgamma(x = 2, shape = 3, rate = 1)
## [1] 0.2706706
pgamma(q = 2, shape = 3, rate = 1)
## [1] 0.3233236
qgamma(p = 0.95, shape = 3, rate = 1)
## [1] 6.295794
rgamma(n = 10, shape = 3, rate = 1)
##  [1] 0.5491514 1.9174906 3.0588171 3.3435465 2.7230451 2.3157012 5.0744692
##  [8] 2.1722312 1.0491009 3.7537977

13.0.9 Ejemplo 9

Sea X una variable aleatoria con distribución Beta \(X \sim \text{Beta}(\alpha=2, \beta=5)\). Hallar:

  • La probabilidad de que \(X\) sea igual a 0.5.
  • La probabilidad acumulada hasta 0.5.
  • El cuantil 95% de la distribución.
  • Una muestra aleatoria de tamaño 10.
# ---------------------------
# Distribución Beta
# ---------------------------
dbeta(x = 0.5, shape1 = 2, shape2 = 5)
## [1] 0.9375
pbeta(q = 0.5, shape1 = 2, shape2 = 5)
## [1] 0.890625
qbeta(p = 0.95, shape1 = 2, shape2 = 5)
## [1] 0.5818034
rbeta(n = 10, shape1 = 2, shape2 = 5)
##  [1] 0.27108751 0.27817387 0.16726128 0.22465492 0.29802030 0.18119206
##  [7] 0.40527593 0.07074314 0.35169288 0.06921664

13.0.10 Ejemplo 10

Sea X una variable aleatoria con distribución F \(X \sim F(d_1=5, d_2=10)\). Hallar:

  • La probabilidad de que \(X\) sea igual a 2.
  • La probabilidad acumulada hasta 2.
  • El cuantil 95% de la distribución.
  • Una muestra aleatoria de tamaño 10.
# ---------------------------
# Distribución F de Snedecor
# ---------------------------
df(x = 2, df1 = 5, df2 = 10)
## [1] 0.1620057
pf(q = 2, df1 = 5, df2 = 10)
## [1] 0.835805
qf(p = 0.95, df1 = 5, df2 = 10)
## [1] 3.325835
rf(n = 10, df1 = 5, df2 = 10)
##  [1] 1.1230508 0.8265756 0.8785250 0.2119591 0.4715726 1.3597041 0.4829465
##  [8] 0.6512878 1.3205420 1.6119123

13.0.11 Ejemplo 11

Sea X una variable aleatoria con distribución Lognormal \(X \sim \text{Lognormal}(\mu=0, \sigma=1)\). Hallar:

  • La probabilidad de que \(X\) sea igual a 2.
  • La probabilidad acumulada hasta 2.
  • El cuantil 90% de la distribución.
  • Una muestra aleatoria de tamaño 10.
# ---------------------------
# Distribución Log-normal
# ---------------------------
dlnorm(x = 2, meanlog = 0, sdlog = 1)
## [1] 0.156874
plnorm(q = 2, meanlog = 0, sdlog = 1)
## [1] 0.7558914
qlnorm(p = 0.9, meanlog = 0, sdlog = 1)
## [1] 3.602224
rlnorm(n = 10, meanlog = 0, sdlog = 1)
##  [1] 2.0405931 0.5810712 2.4248711 0.7056791 0.3649282 6.5743949 0.3949599
##  [8] 0.7451301 0.5406678 0.3878736

13.0.12 Ejemplo 12

Sea X una variable aleatoria con distribución Weibull \(X \sim \text{Weibull}(k=2, \lambda=3)\). Hallar:

  • La probabilidad de que \(X\) sea igual a 2.
  • La probabilidad acumulada hasta 2.
  • El cuantil 95% de la distribución.
  • Una muestra aleatoria de tamaño 10.
# ---------------------------
# Distribución Weibull
# ---------------------------
dweibull(x = 2, shape = 2, scale = 3)
## [1] 0.2849691
pweibull(q = 2, shape = 2, scale = 3)
## [1] 0.3588196
qweibull(p = 0.95, shape = 2, scale = 3)
## [1] 5.192455
rweibull(n = 10, shape = 2, scale = 3)
##  [1] 1.6997715 2.5477753 4.9767129 1.4777848 2.8006324 0.4153065 3.3711225
##  [8] 1.2186561 4.7416353 1.0414827

13.0.13 Ejemplo 13

Sea X una variable aleatoria con distribución Logística \(X \sim \text{Logística}(\mu=0, s=1)\). Hallar:

  • La probabilidad de que \(X\) sea igual a 0.
  • La probabilidad acumulada hasta 0.
  • El cuantil 95% de la distribución.
  • Una muestra aleatoria de tamaño 10.
# ---------------------------
# Distribución Logística
# ---------------------------
dlogis(x = 0, location = 0, scale = 1)
## [1] 0.25
plogis(q = 0, location = 0, scale = 1)
## [1] 0.5
qlogis(p = 0.95, location = 0, scale = 1)
## [1] 2.944439
rlogis(n = 10, location = 0, scale = 1)
##  [1] -0.1123952 -2.0999574 -0.6933963  1.6391303 -0.9601416  0.3517222
##  [7]  1.6341128 -2.5690961  0.8605653  0.8417067

14 R Shiny

R Shiny es un paquete que permite crear aplicaciones web interactivas directamente desde R.

Se compone de dos partes principales:

  • UI (User Interface): define cómo se ve la aplicación.
  • Server: define la lógica, cálculos y reactividad.

14.1 Estructura básica de una app Shiny

library(shiny)

ui <- fluidPage(
  titlePanel("Mi primera app Shiny"),
  sidebarLayout(
    sidebarPanel(
      sliderInput("num", "Número de observaciones:", 1, 100, 50)
    ),
    mainPanel(
      plotOutput("hist")
    )
  )
)

server <- function(input, output) {
  output$hist <- renderPlot({
    hist(rnorm(input$num), main = "Histograma aleatorio")
  })
}

shinyApp(ui = ui, server = server)
Shiny applications not supported in static R Markdown documents