<- 1
a
print(a)
[1] 1
En primer lugar vamos a generar un marco de datos o data frame, desde donde vamos a contener y manipular datos.
Simplifica mucho para la escritura y nomenclatura de variables el uso de minúsculas y evitar espacios entre palabras.
Variable como una caja, que tiene una etiqueta que es el nombre de la variable. Dentro de la caja podemos guardar un valor.
<- 1
a
print(a)
[1] 1
<- 2
b b
[1] 2
+3 a
[1] 4
Importante el orden de como se corren los códigos
+3 b
[1] 5
Variable de caracter
<- "casos"
c
c
[1] "casos"
Un vector es un grupo elementos ordenados, todos deben ser del mismo tipo (todos números o todos caracteres por ejemplo). La forma más simple de crear un vector es usando la función c()
y separando por comas a los elementos que lo forman:
# creación de vector simple
<- c("confirmado", "sospechoso", "confirmado", "sospechoso")
casos_dengue
# imprime el vector
casos_dengue
[1] "confirmado" "sospechoso" "confirmado" "sospechoso"
class(casos_dengue)
[1] "character"
<- c(23,65,89,45,33,21,42)
edad
edad
[1] 23 65 89 45 33 21 42
class(edad)
[1] "numeric"
Podemos concatenar nuestras dos variables con c()
<- c(casos_dengue,edad)
casos_2
casos_2
[1] "confirmado" "sospechoso" "confirmado" "sospechoso" "23"
[6] "65" "89" "45" "33" "21"
[11] "42"
[1] en el resultado los numeros en corchetes marcan la pocicion que ocupan las vacriables en los vectores.
Ahora la edad se muestra como caracter
class(casos_2)
[1] "character"
<-c(1:8) #Es lo mismo que escribir c(1,2,3,4)
a
a
[1] 1 2 3 4 5 6 7 8
¿Que hace si operamos vectores de diferentes longitudes? R aplica una técnica llamada “recycling” o reciclaje
<- c(1, 2, 3, 4, 5) # Longitud 5
vector1 <- c(10, 20) # Longitud 2
vector2
# Realiza una operación aritmética
<- vector1 + vector2
resultado
resultado
[1] 11 22 13 24 15
vector1
tiene 5 elementos: 1, 2, 3, 4, 5
vector2
tiene 2 elementos: 10, 20
Cuando sumas vector1
y vector2
, R recicla vector2
para que coincida con la longitud de vector1
. Esto significa que vector2
se repite para alinear con vector1
:
La operación es equivalente a sumar vector1
con vector2
reciclado: (10, 20)
se repite para igualar la longitud de vector1
.
El reciclaje se realiza así: vector2
se convierte en 10, 20, 10, 20, 10
Entonces el cálculo es:
(1 + 10) = 11
(2 + 20) = 22
(3 + 10) = 13
(4 + 20) = 24
(5 + 10) = 15
Ahora generaremos otro vector y los combinamos:
<- c("1","2","3","4")
id_caso
id_caso
[1] "1" "2" "3" "4"
Combinación de vectores para crear un data frame o marco de datos. Este aparece ahora en el entorno global
# Creamos un data frame
<- data.frame(
df caso_dengue = c("confirmado", "sospechoso", "confirmado", "descartado"),
id_caso = c("1","2","3","4"))
df
caso_dengue id_caso
1 confirmado 1
2 sospechoso 2
3 confirmado 3
4 descartado 4
ls() # Muestra todos los objetos en el entorno global
[1] "a" "b" "c" "casos_2" "casos_dengue"
[6] "df" "edad" "id_caso" "resultado" "vector1"
[11] "vector2"
rm(df) # Elimina el objeto 'x' del entorno global
Es lo mismo que:
<- data.frame(casos_dengue,id_caso)
df
df
casos_dengue id_caso
1 confirmado 1
2 sospechoso 2
3 confirmado 3
4 sospechoso 4
Se puede luego agregar una tercera columna con edades por ejemplo. Es importate tener la misma cantidad de filas y columnas.
<- c(34,65,13,25)
edad
<- data.frame(casos_dengue,id_caso,edad) df_2
df_2
casos_dengue id_caso edad
1 confirmado 1 34
2 sospechoso 2 65
3 confirmado 3 13
4 sospechoso 4 25
R ahora lo reconoce df_2
como un objeto con el que podemos hacer cosas y reemplaza al anterior porque se llama igual
nrow(df_2)#nos dice el numero de filas del DF
[1] 4
ncol(df_2)#nos dice la cantidad de columnas de DF
[1] 3
dim(df_2)# nos devuelve un vector con los valores filas y columnas de DF
[1] 4 3
colnames(df_2)#nos dice los nombres de las columnas del DF
[1] "casos_dengue" "id_caso" "edad"
summary(df_2)#Nos retorna información de cada variable que forma el df
casos_dengue id_caso edad
Length:4 Length:4 Min. :13.00
Class :character Class :character 1st Qu.:22.00
Mode :character Mode :character Median :29.50
Mean :34.25
3rd Qu.:41.75
Max. :65.00
Length: 4: La columna edad
tiene 4 elementos.
Min. :13.00: El valor mínimo en la columna edad
es 13 años.
1st Qu.:22.00: El primer cuartil (Q1) es 22 años. Esto significa que el 25% de los datos están por debajo de 22 años.
Median :29.50: La mediana es 29.5 años. La mediana divide los datos en dos mitades; la mitad de los valores son menores o iguales a 29.5 años y la otra mitad son mayores o iguales.
Mean :34.25: La media o promedio de la columna edad
es 34.25 años.
3rd Qu.:41.75: El tercer cuartil (Q3) es 41.75 años. Esto indica que el 75% de los datos están por debajo de 41.75 años.
Max. :65.00: El valor máximo en la columna edad
es 65 años.
Marcadores de posición [ ]
y funcionalidades de base de R
Si queremos acceder a una variable en especifico debemos marcar entre corchetes y comas las posiciones que buscamos:
Primero se coloca la fila y luego la columna
2,1] df_2[
[1] "sospechoso"
Es decir accedemos a la segunda fila y la primera columna
Si dejamos en blanco las filas R interpreta que queremos seleccionar toda una columna. Por ejemplo, queremos emplear todos los elementos de la primera columna.
1] df_2[ ,
[1] "confirmado" "sospechoso" "confirmado" "sospechoso"
o también podemos seleccionar todos los elementos de una fila
2, ] df_2[
casos_dengue id_caso edad
2 sospechoso 2 65
Si queremos modificar el valor de una columna tambien usamos corchetes:
2,1] <- "confirmado"
df_2[
df_2
casos_dengue id_caso edad
1 confirmado 1 34
2 confirmado 2 65
3 confirmado 3 13
4 sospechoso 4 25
Sus funciones principales, como filter(), select(), mutate(), summarize() y arrange()
es parte del tidyverse
, que es un conjunto de paquetes en R diseñados para el análisis de datos y la ciencia de datos.
Por ejemplo algunas variables que R puede tomar como carcateres las queremos pasar a numéricas para poder manipularlas.
Usando la sintaxis base de R tambien podemos hacer con $
Seleccionar una columna (como id_caso
):
$id_caso df_2
[1] "1" "2" "3" "4"
Seleccionar múltiples columnas (como id_caso
y edad
):
c("id_caso", "edad")] df_2[
id_caso edad
1 1 34
2 2 65
3 3 13
4 4 25
Usando la función select()
de library(dplyr)
Seleccionar datos del data frame:
library(dplyr)
# Selecciono del marco de datos df_2 la columna de id_caso
select(df_2,id_caso)
id_caso
1 1
2 2
3 3
4 4
# Selecciono del marco de datos df_2 mas de una columna
select(df_2, id_caso, edad)
id_caso edad
1 1 34
2 2 65
3 3 13
4 4 25
# Esto no se guardará en un nuevo data frame si no le asignamos un nombre a una nueva variable
Siempre se escibre: Select (.data, columna)
# Puedo seleccionar columnas por posición
select(df_2,(2:3))
id_caso edad
1 1 34
2 2 65
3 3 13
4 4 25
Reordenar columnas por nombre
# Reordenar columnas por nombre
select(df_2,edad, id_caso, casos_dengue)
edad id_caso casos_dengue
1 34 1 confirmado
2 65 2 confirmado
3 13 3 confirmado
4 25 4 sospechoso
Mover una columna al principio
select(df_2, casos_dengue, everything())
casos_dengue id_caso edad
1 confirmado 1 34
2 confirmado 2 65
3 confirmado 3 13
4 sospechoso 4 25
Renombrar columnas
Podemos hacerlo con la función rename()
rename(df_2,
id_lab = id_caso)
casos_dengue id_lab edad
1 confirmado 1 34
2 confirmado 2 65
3 confirmado 3 13
4 sospechoso 4 25
Usando la sintaxis base de R:
# Seleccionar múltiples filas, por ejemplo, las primeras dos filas:
1:2, ] df_2[
casos_dengue id_caso edad
1 confirmado 1 34
2 confirmado 2 65
# Seleccionar las filas donde la edad de la columna edad es mayor a 30
$edad > 30, ] df_2[df_2
casos_dengue id_caso edad
1 confirmado 1 34
2 confirmado 2 65
Usando la función filter()
de library(dplyr)
Para que funcione, la filter()
función requiere que le pasemos dos valores.
El primer valor es el nombre del objeto del marco de datos con las filas que queremos subdividir. El segundo es la condición que se utiliza para subdividir las filas. Supongamos que queremos hacer un análisis de subgrupos utilizando solo los casos confirmados.
# Elegimos solo casos confirmados
filter(df_2, casos_dengue == "confirmado")
casos_dengue id_caso edad
1 confirmado 1 34
2 confirmado 2 65
3 confirmado 3 13
# Seleccionamos solo cuando tengan más de 30 años
filter(df_2, edad > 30)
casos_dengue id_caso edad
1 confirmado 1 34
2 confirmado 2 65
# ultimas filas del data frame contando desde la última
slice_tail(df_2, n = 3)
casos_dengue id_caso edad
1 confirmado 2 65
2 confirmado 3 13
3 sospechoso 4 25
Función summarize()
Esta función permite calcular estadísticas agregadas o resumidas de una o más variables dentro de un grupo.
summarize( df_2,
media_valor = mean(edad),
suma_valor = sum(edad)
)
media_valor suma_valor
1 34.25 137
El sumaize se usa mucho con group_by
para calcular resúmenes (sumas, promedios, conteos, etc.) sobre subconjuntos de datos, basados en los grupos que defines. Sirve para realizar cálculos agregados sobre grupos de datos, de manera estructurada
# Primero agrupar los datos por la columna 'casos_dengue'
# Luego sumar la columna 'edad' para cada grupo
# group_by() a una columna, R "agrupa" todas las filas que tienen el mismo valor en esa columna.
<- df_2 %>%
df_resumen group_by(casos_dengue) %>%
summarize(suma_edad = sum(edad))
df_resumen
# A tibble: 2 × 2
casos_dengue suma_edad
<chr> <dbl>
1 confirmado 112
2 sospechoso 25
Función mutate() para la creación y modificación de columnas
La función mutate()
del paquete dplyr
en R se utiliza para agregar nuevas columnas a un data frame o modificar las columnas existentes.
# library(dplyr)
<- df_2 %>%
df_num mutate(id = as.numeric(id_caso))
df_num
casos_dengue id_caso edad id
1 confirmado 1 34 1
2 confirmado 2 65 2
3 confirmado 3 13 3
4 sospechoso 4 25 4
# Clasificar la edad
mutate(df_num,
grupo_edad = if_else(edad < 30, "joven", "adulto"))
casos_dengue id_caso edad id grupo_edad
1 confirmado 1 34 1 adulto
2 confirmado 2 65 2 adulto
3 confirmado 3 13 3 joven
4 sospechoso 4 25 4 joven
# if_else(condition, true, false, missing = NULL)
Función arrange() para ordenar
La función arrange()
en el paquete dplyr
se utiliza para ordenar las filas de un data frame
Sintaxis: arrange(.data, columnas)
# Ordenar segun edad
arrange(df_num, casos_dengue)
casos_dengue id_caso edad id
1 confirmado 1 34 1
2 confirmado 2 65 2
3 confirmado 3 13 3
4 sospechoso 4 25 4
# Ordenar segun edad descendente
arrange(df_num, desc(edad))
casos_dengue id_caso edad id
1 confirmado 2 65 2
2 confirmado 1 34 1
3 sospechoso 4 25 4
4 confirmado 3 13 3
En R, representamos los datos faltantes con un NA
. Este valor R lo lee como un valor de tipo lógico a diferencia de numéricos o de caracter.
typeof(NA)
[1] "logical"
Hay que tener en cuenta que cuando se agrega un NA
(lógico por defecto) a un vector con valores numéricos como por ejemplo: c(68, 63, 71, NA)
), eso haría que tuvieras tres valores numéricos y un valor lógico en el mismo vector, lo cual no está permitido. Por lo tanto, R convertirá automáticamente el NA
a NA_real_
.
A nuestro marco de datos le agregaremos una columna y le indicaremos los datos faltantes
# Agrego una columna de región que tiene datos faltantes
<- df_num %>%
df_na mutate(region = c("norte", "sin dato", "sur", "sin dato"))
df_na
casos_dengue id_caso edad id region
1 confirmado 1 34 1 norte
2 confirmado 2 65 2 sin dato
3 confirmado 3 13 3 sur
4 sospechoso 4 25 4 sin dato
# paso dato faltante a na (Not Available)
<- df_na %>%
df_limpio mutate(region = na_if(region, "sin dato"))
df_limpio
casos_dengue id_caso edad id region
1 confirmado 1 34 1 norte
2 confirmado 2 65 2 <NA>
3 confirmado 3 13 3 sur
4 sospechoso 4 25 4 <NA>
Función na_if
se utiliza para reemplazar valores específicos en un vector o columna con NA
na_if(x, y)
x
: El vector o columna en el que deseas hacer la sustitución.
y
: El valor que deseas reemplazar con NA
.
Este |>
es el operador de tubería. A partir de la versión 4.1, el operador de tubería es parte de la base de R. Antes de la versión 4.1, el operador de tubería solo estaba disponible en magrittr y se utilizan ampliamente en el tidyverse (particularmente en paquetes como dplyr
). La tubería importada del magrittr
paquete se veía así %>%
.
La idea principal de una tubería es que el resultado de una operación se pasa como entrada (primer argumento) a la siguiente función.
En el tipo de Windows shift + control + m
Sintaxis básica:
objeto %>% funcion1() %>% funcion2() %>% funcion3()
Esto se traduce a que objeto
es pasado primero a funcion1()
, luego el resultado es pasado a funcion2()
, y finalmente el resultado es usado en funcion3()
.
Partiendo de nuestro data frame anterior podemos utilizar las tuberias para filtrar, ordenar y seleccionar columnas.
<- df_na %>%
df_tuberia filter(edad > 20) %>% # Filtrar casos con edad mayor a 20
arrange(desc(edad)) %>% # Ordenar por edad en orden descendente
select(casos_dengue, edad) # Seleccionar solo las columnas 'casos_dengue' y 'edad'
# Mostrar el resultado
print(df_tuberia)
casos_dengue edad
1 confirmado 65
2 confirmado 34
3 sospechoso 25
Estructura de una función:
<- function(argumento1, argumento2, ...) {
nombre_funcion # Cuerpo de la función: operaciones y cálculos
<- argumento1 + argumento2 # Ejemplo de operación
resultado
return(resultado) # Devolver el resultado
}
Definición de la Función:
Nombre de la Función: Define cómo se llamará la función.
Argumentos: Los parámetros que la función aceptará.
Cuerpo de la Función: Donde se escriben las instrucciones que realiza la función.
Valor de Retorno: El resultado que la función devuelve.
Ejemplo de una función:
# Definir la función
<- function(a, b) {
suma <- a + b # Sumar los dos números
resultado return(resultado) # Devolver el resultado
}
# Llamar a la función
<- suma(5, 3)
resultado
# Imprimir el resultado
print(resultado) # Imprime 8
[1] 8
Un tibble es una versión mejorada de un data frame en R. Aunque ambos sirven para almacenar datos en forma de tabla, los tibbles tienen algunas características adicionales que los hacen más fáciles de usar.
Los tibbles muestran solo las primeras 10 filas y las columnas que se ajustan en la pantalla, facilitando la visualización de datos grandes.
Las columnas se muestran con sus nombres completos, sin truncar el contenido, a menos que sea necesario.
Pasar de un data frame a un tibble:
# Convertir el data frame a tibble
<- as_tibble(df_limpio)
df_tibble
df_tibble
# A tibble: 4 × 5
casos_dengue id_caso edad id region
<chr> <chr> <dbl> <dbl> <chr>
1 confirmado 1 34 1 norte
2 confirmado 2 65 2 <NA>
3 confirmado 3 13 3 sur
4 sospechoso 4 25 4 <NA>
Para realizar algunos ejercicios primero tendremos que instalar los paquetes. Un paquete en R es una colección organizada de funciones, datos y documentación que extiende las capacidades básicas del lenguaje. Los pasos para ello consisten primero en instalarlos y luego cargar las librerías.
Cargar las librerías en R significa hacer que las funciones y herramientas de un paquete estén disponibles para que puedas usarlas en tu sesión de R. Cuando instalas un paquete con install.packages()
, se descarga y guarda en tu computadora, pero no se activa automáticamente. Para empezar a usarlo, necesitas “cargar” la librería en la sesión de R con la función library()
.
# install.packages("tidyverse") # manipulación y visualización de datos
# install.packages("data.table") # manipulación de grandes datasets
# install.packages("lubridate") # creación, manipulación y extracción de información temporal en R
# install.packages("readxl") # lectura de archivos Excel
# install.packages("googlesheets4") # Permite leer, escribir y manipular hojas de cálculo alojadas en Google Drive
# install.packages("httpuv") # es utilizado en segundo plano para manejar la autenticación OAuth cuando accedes a Google Sheets.
# install.packages("rmarkdown") # crear documentos combinando texto, código y resultados de análisis en un solo archivo.
# install.packages("tinytex") # generar documentos en formato PDF con rmarkdown