Ariadna Sofia Contreras
Maria Isabel Jaimes
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.
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.
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
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().
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.
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().
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.
Los tipos de objetos básicos en R se dividen en:
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:
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"
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.
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
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
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
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")
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 |
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.
# Se cumple la condición y se muestra "verdadero"
if(4 > 3) {
"Verdadero"
}
## [1] "Verdadero"
# 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
}
# Se cumple la condición y se muestra "Verdadero"
if(4 > 3) {
"Verdadero"
} else {
"Falso"
}
## [1] "Verdadero"
# No se cumple la condición y se muestra "Falso"
if(4 > 5) {
"Verdadero"
} else {
"Falso"
}
## [1] "Falso"
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)
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"
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"
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
}
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
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"
Este es un tipo de bucle que ocurre mientras una condición es
verdadera (TRUE). El modelo de while es:
while(condicion) {
operaciones
}
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
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
break nos permite interrumpir un bucle, mientras que
next nos deja avanzar a la siguiente iteración del
bucle.
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
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
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:
Todas las funciones de esta familia reciben como argumentos a un objeto y al menos una función.
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.
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
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"
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
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.
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
install.packages("readxl")
library(readxl)
help(read_excel)
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
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" ...
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" ...
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
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" ...
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
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" ...
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 ...
install.packages("readr")
library(readr)
help(read_delim)
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)
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)
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)
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)
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)
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)
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)
Guardar el conjunto de datos mortality_data en el directorio de trabajo.
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>
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
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>
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
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.
# 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
| Operador | Significado |
|---|---|
| + | Suma |
| - | Resta |
| * | Multiplicación |
| / | División |
| ^ | Potenciación |
| %% | Residuo de la divisió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 |
| 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.
# 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.
# 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.
# 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
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)
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
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
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
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 ...
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>
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>
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>
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>
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
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
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.
# 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.
# 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")
mortality_data<-readRDS("mortality_data.RDS")
¿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"))
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
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
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
Sea X una variable aleatoria con distribución binomial \(X \sim \text{Binomial}(n=10, p=0.5)\). Hallar:
# ---------------------------
# 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
Sea X una variable aleatoria con distribución Poisson \(X \sim \text{Poisson}(\lambda=2)\). Hallar:
# ---------------------------
# 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
Sea X una variable aleatoria con distribución Normal \(X \sim \text{Normal}(\mu=0, \sigma=1)\). Hallar:
# ---------------------------
# 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
Sea X una variable aleatoria con distribución Uniforme \(X \sim \text{Uniforme}(a=0, b=1)\). Hallar:
# ---------------------------
# 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
Sea X una variable aleatoria con distribución Exponencial \(X \sim \text{Exponencial}(\lambda=0.5)\). Hallar:
# ---------------------------
# 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
Sea X una variable aleatoria con distribución t de Student \(X \sim t(\nu=10)\). Hallar:
# ---------------------------
# 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
Sea X una variable aleatoria con distribución Chi-cuadrado \(X \sim \chi^2(k=5)\). Hallar:
# ---------------------------
# 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
Sea X una variable aleatoria con distribución Gamma \(X \sim \text{Gamma}(\alpha=3, \beta=1)\). Hallar:
# ---------------------------
# 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
Sea X una variable aleatoria con distribución Beta \(X \sim \text{Beta}(\alpha=2, \beta=5)\). Hallar:
# ---------------------------
# 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
Sea X una variable aleatoria con distribución F \(X \sim F(d_1=5, d_2=10)\). Hallar:
# ---------------------------
# 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
Sea X una variable aleatoria con distribución Lognormal \(X \sim \text{Lognormal}(\mu=0, \sigma=1)\). Hallar:
# ---------------------------
# 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
Sea X una variable aleatoria con distribución Weibull \(X \sim \text{Weibull}(k=2, \lambda=3)\). Hallar:
# ---------------------------
# 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
Sea X una variable aleatoria con distribución Logística \(X \sim \text{Logística}(\mu=0, s=1)\). Hallar:
# ---------------------------
# 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
R Shiny es un paquete que permite crear aplicaciones web interactivas directamente desde R.
Se compone de dos partes principales:
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)