En R, tenemos vectores, matrices, data.frames y listas.
Entender la lógica de estos objetos es importante antes de iniciar el
trabajo con data secundaria.
Un vector es una coleccion de uno o mas datos del mismo tipo. Un vector puede incluir datos numericos, datos en texto o datos logicos (verdadero/falso).
Vector de cadena de texto
pais=c("Bolivia", "Colombia", "Ecuador", "Peru", "Argentina", "Brasil", "Chile", "Paraguay", "Uruguay")
pais
## [1] "Bolivia" "Colombia" "Ecuador" "Peru" "Argentina" "Brasil"
## [7] "Chile" "Paraguay" "Uruguay"
Vector numerico
hab2022_millones=c(12.22, 51.87, 18, 34.05, 46.23, 215.3, 19.6, 6.8, 3.4)
hab2022_millones
## [1] 12.22 51.87 18.00 34.05 46.23 215.30 19.60 6.80 3.40
Vector logico
miembro_CAN=c(TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE)
Para visualizar los vectores que hemos creado
podemos colocar el nombre de los vectores creados (pais
,
hab2022_millones
, miembro_CAN
) o utilizar la
funcion print
.
Los vectores pueden unirse en una matriz. Una matri es una estructura de datos bidimensional (files y columnas) que coniene elementos del mismo tipo (solo datos numéricos o solo caracteres).
datosA <-cbind(pais, hab2022_millones, miembro_CAN) # cbind() une vectores, interpretando cada uno como una columna
datosA
## pais hab2022_millones miembro_CAN
## [1,] "Bolivia" "12.22" "TRUE"
## [2,] "Colombia" "51.87" "TRUE"
## [3,] "Ecuador" "18" "TRUE"
## [4,] "Peru" "34.05" "TRUE"
## [5,] "Argentina" "46.23" "FALSE"
## [6,] "Brasil" "215.3" "FALSE"
## [7,] "Chile" "19.6" "FALSE"
## [8,] "Paraguay" "6.8" "FALSE"
## [9,] "Uruguay" "3.4" "FALSE"
datosB <-rbind(pais, hab2022_millones, miembro_CAN) # rbind() une vectores, interpretando cada uno como una fila
datosB
## [,1] [,2] [,3] [,4] [,5] [,6]
## pais "Bolivia" "Colombia" "Ecuador" "Peru" "Argentina" "Brasil"
## hab2022_millones "12.22" "51.87" "18" "34.05" "46.23" "215.3"
## miembro_CAN "TRUE" "TRUE" "TRUE" "TRUE" "FALSE" "FALSE"
## [,7] [,8] [,9]
## pais "Chile" "Paraguay" "Uruguay"
## hab2022_millones "19.6" "6.8" "3.4"
## miembro_CAN "FALSE" "FALSE" "FALSE"
Como es posible observar, a pesar de que los vectores iniciales eran
numéricos, de texto y lógicos, al unirse en una matriz, todos son
interpretados como cadenas de texto (chr)
.
str(datosA)
## chr [1:9, 1:3] "Bolivia" "Colombia" "Ecuador" "Peru" "Argentina" "Brasil" ...
## - attr(*, "dimnames")=List of 2
## ..$ : NULL
## ..$ : chr [1:3] "pais" "hab2022_millones" "miembro_CAN"
Finalmente, podemos crear datasets uniendo vectores.
Los dataframes, a diferencia de las matrices, permiten crear bases con
datos de diferentes tipos (numericos, caracteres, factores, etc.)
datosC<- data.frame(pais, hab2022_millones, miembro_CAN)
datosC
## pais hab2022_millones miembro_CAN
## 1 Bolivia 12.22 TRUE
## 2 Colombia 51.87 TRUE
## 3 Ecuador 18.00 TRUE
## 4 Peru 34.05 TRUE
## 5 Argentina 46.23 FALSE
## 6 Brasil 215.30 FALSE
## 7 Chile 19.60 FALSE
## 8 Paraguay 6.80 FALSE
## 9 Uruguay 3.40 FALSE
Tambien podemos crear un dataset desde cero
datosD <-data.frame(pais=c("Bolivia", "Colombia", "Ecuador", "Peru", "Argentina", "Brasil", "Chile", "Paraguay", "Uruguay"), hab2022_millones=c(12.22, 51.87, 18, 34.05, 46.23, 215.3, 19.6, 6.8, 3.4), miembro_CAN=c(TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE))
datosD
## pais hab2022_millones miembro_CAN
## 1 Bolivia 12.22 TRUE
## 2 Colombia 51.87 TRUE
## 3 Ecuador 18.00 TRUE
## 4 Peru 34.05 TRUE
## 5 Argentina 46.23 FALSE
## 6 Brasil 215.30 FALSE
## 7 Chile 19.60 FALSE
## 8 Paraguay 6.80 FALSE
## 9 Uruguay 3.40 FALSE
Para entender las diferencias entre data.frame
y
cbind
, podemos usar el comando class
(que nos
permite ver el “tipo” de datos)
class(datosA) # matriz
## [1] "matrix" "array"
class(datosC) # data.frame
## [1] "data.frame"
class(datosC$miembro_CAN) #data.frame
## [1] "logical"
str(datosC) #cada vector mantiene su estructura original.
## 'data.frame': 9 obs. of 3 variables:
## $ pais : chr "Bolivia" "Colombia" "Ecuador" "Peru" ...
## $ hab2022_millones: num 12.2 51.9 18 34 46.2 ...
## $ miembro_CAN : logi TRUE TRUE TRUE TRUE FALSE FALSE ...
Ejercicio 1: Crea una base de datos de 3 filas y 5 columnas, que contenga un variable numerica, otra logica y otra de texto.
Cuando trabajamos en R es importante definir cual es nuestro espacio
de trabajo (la carpeta en la que trabajaremos y se almacenaran nuestras
BD, imagenes, etc.) getwd()
muestra el directorio de
trabajo actual, mientras que setwd()
establece el directorio
de trabajo.
getwd() # muestra el directorio de trabajo actual
## [1] "D:/Documentos/Trabajo/Docencia/PUCP/2025-2 Estadistica1/Practicas/LABs PUCP/P2"
setwd("D:/Documentos/Trabajo/Docencia/PUCP/2025-2 Estadistica1/Practicas/LABs PUCP/P2") #indica el directorio de trabajo donde quiero trabajar.
Para importar/exportar algunos formatos es necesario instalar y abrir
algunos paquetes.
En caso no se encuentren disponibles podras instalarlos con
install.packages("")
. Podemos guardarlo en formatos
diferentes al original
Los paquetes que te permitiran abrir archivos en diferentes formatos
son: openxlsx
(para archivos en xlsx),
readxl
(para archivos en xlsx), haven
(para archivos de stata y spss), rio
(para
archivos en diferentes formatos) entre otros.
Instalamos las librerias que usaremos en este laboratorio
rio
, dplyr
, luridate
,
psych
Trabajaremos con la base de datos del Siseve.
R puede trabajar con diversos tipos de archivos (csv, excel, spss,
stata, google, dropbox, entre otros)
Importar archivos excel. En este caso, importaremos nuestra base de datos que esta en excel.
siseve <- import("Siseve2024.xlsx") # debo colocar el nombre de la base de datos tal como se encuentra guardado.
Los comandos para guardar archivos en diferentes formatos son:
write.csv(nombredebaseenR, "nombredebase.csv")
,
write_save(nombredebaseenR, "nombredebase.sav")
,
write_dta(nombredebaseenR, "nombredebase.dta")
En este caso exportaremos el documento a un formato en excel
(.xlsx).
write.xlsx(siseve, file="siseve.xlsx")
Ejercicio 2: Descarga una base de datos de la Plataforma Nacional de Datos Abiertos - Peru. Importa la base de datos a R y exportala en un formato diferente al original.
Realizamos algunas exploraciones
names(siseve) # brinda el nombre de las variables
## [1] "FECHA_REPORTE" "DRE" "UGEL"
## [4] "NIVEL_EDUCATIVO" "TIPO_REPORTE" "TIPO_VIOLENCIA"
## [7] "SUBTIPO_VIOLENCIA" "TIPO_ESTADO_REPORTE"
head(siseve) # brinda una idea de la estructura de la base (10 primeros casos)
## FECHA_REPORTE DRE UGEL
## 1 2024-07-31 DRE Cusco UGEL Urubamba
## 2 2024-07-31 DRE Cusco UGEL Urubamba
## 3 2024-07-31 DRE Tacna UGEL Tacna
## 4 2024-07-31 DRE Lima Metropolitana UGEL 03 Cercado
## 5 2024-07-31 DRE Loreto UGEL Alto Amazonas - Yurimaguas
## 6 2024-07-31 DRE Lima Metropolitana UGEL 07 San Borja
## NIVEL_EDUCATIVO TIPO_REPORTE TIPO_VIOLENCIA SUBTIPO_VIOLENCIA
## 1 Primaria Personal IE a Escolares Psicológica Verbal
## 2 Primaria Personal IE a Escolares Psicológica Verbal
## 3 Primaria Personal IE a Escolares Psicológica Trato humillante
## 4 Primaria Personal IE a Escolares Psicológica Verbal
## 5 Secundaria Personal IE a Escolares Psicológica Verbal
## 6 Secundaria Entre Escolares Física Sin lesiones
## TIPO_ESTADO_REPORTE
## 1 Pendiente de atención por la IE
## 2 Pendiente de atención por la IE
## 3 Pendiente de atención por la IE
## 4 Atención en proceso
## 5 Atención en proceso
## 6 Atención en proceso
str(siseve) # brinda una idea de la estructura de la base (tipos de variables, etc.)
## 'data.frame': 81714 obs. of 8 variables:
## $ FECHA_REPORTE : POSIXct, format: "2024-07-31" "2024-07-31" ...
## $ DRE : chr "DRE Cusco" "DRE Cusco" "DRE Tacna" "DRE Lima Metropolitana" ...
## $ UGEL : chr "UGEL Urubamba" "UGEL Urubamba" "UGEL Tacna" "UGEL 03 Cercado" ...
## $ NIVEL_EDUCATIVO : chr "Primaria" "Primaria" "Primaria" "Primaria" ...
## $ TIPO_REPORTE : chr "Personal IE a Escolares" "Personal IE a Escolares" "Personal IE a Escolares" "Personal IE a Escolares" ...
## $ TIPO_VIOLENCIA : chr "Psicológica" "Psicológica" "Psicológica" "Psicológica" ...
## $ SUBTIPO_VIOLENCIA : chr "Verbal" "Verbal" "Trato humillante" "Verbal" ...
## $ TIPO_ESTADO_REPORTE: chr "Pendiente de atención por la IE" "Pendiente de atención por la IE" "Pendiente de atención por la IE" "Atención en proceso" ...
summary(siseve) #brinda un resumen de las variables de la base
## FECHA_REPORTE DRE UGEL
## Min. :2013-09-16 00:00:00 Length:81714 Length:81714
## 1st Qu.:2018-08-24 00:00:00 Class :character Class :character
## Median :2022-03-31 00:00:00 Mode :character Mode :character
## Mean :2020-11-05 21:35:29
## 3rd Qu.:2023-08-01 00:00:00
## Max. :2024-07-31 00:00:00
## NIVEL_EDUCATIVO TIPO_REPORTE TIPO_VIOLENCIA SUBTIPO_VIOLENCIA
## Length:81714 Length:81714 Length:81714 Length:81714
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## TIPO_ESTADO_REPORTE
## Length:81714
## Class :character
## Mode :character
##
##
##
describe(siseve) #brinda informacion general
## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf
## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf
## vars n mean sd median trimmed mad min max range
## FECHA_REPORTE 1 81714 NaN NA NA NaN NA Inf -Inf -Inf
## DRE* 2 81714 13.43 5.94 15 13.50 4.45 1 26 25
## UGEL* 3 81714 72.74 72.50 40 64.68 51.89 1 223 222
## NIVEL_EDUCATIVO* 4 81714 10.40 0.97 11 10.59 0.00 1 11 10
## TIPO_REPORTE* 5 81714 1.43 0.49 1 1.41 0.00 1 2 1
## TIPO_VIOLENCIA* 6 81714 1.72 0.74 2 1.65 1.48 1 3 2
## SUBTIPO_VIOLENCIA* 7 81714 10.09 3.68 11 10.42 4.45 1 16 15
## TIPO_ESTADO_REPORTE* 8 81714 1.99 0.49 2 2.00 0.00 1 5 4
## skew kurtosis se
## FECHA_REPORTE NA NA NA
## DRE* -0.18 -0.35 0.02
## UGEL* 0.67 -1.03 0.25
## NIVEL_EDUCATIVO* -3.11 17.50 0.00
## TIPO_REPORTE* 0.30 -1.91 0.00
## TIPO_VIOLENCIA* 0.50 -1.05 0.00
## SUBTIPO_VIOLENCIA* -0.74 -0.38 0.01
## TIPO_ESTADO_REPORTE* 2.84 18.18 0.00
Algunas bases de datos pueden incluir miles de variables o casos que no necesariamente son de nuestro interes. Por tanto, realizaremos algunas ediciones. Ojo: Es importante registrar siempre las ediciones y decisiones que realizamos para garantizar la replicabilidad
Para duplicar la base de datos con otro nombre
siseve24 <- siseve
rm(siseve) #eliminamos siseve para no confundirnos
Esta base de datos cuenta con variables que son autoexplicativas, pero no siempre es asi. Al nombrar variables, se sugiere trabajar siempre con minusculas y sin muchos “-”.
names(siseve24) <- c("fecha", "dre", "ugel", "nivel_educativo", "tipo_reporte", "tipo_violencia", "subtipo_violencia", "estado_reporte")
names(siseve24)
## [1] "fecha" "dre" "ugel"
## [4] "nivel_educativo" "tipo_reporte" "tipo_violencia"
## [7] "subtipo_violencia" "estado_reporte"
Tambien puedo cambiar solo el nombre de una variable. Por ejemplo, quiero cambiar el nombre de “dre” a “region”.
siseve24 <- rename(siseve24, region = dre)
names(siseve24)
## [1] "fecha" "region" "ugel"
## [4] "nivel_educativo" "tipo_reporte" "tipo_violencia"
## [7] "subtipo_violencia" "estado_reporte"
Esta base de datos incluye casos desde el 2013 hasta el 2024, pero solo me interesan aquellos casos del 2023. Para esto, filtramos los casos que corresponden al 2023. Ojo: No siempre el numero de casos coincide con el numero de filas
siseve23 <- siseve24 %>%
filter(year(fecha) == 2023) #estoy creando una nueva base
nrow(siseve24) #en este caso cada fila corresponde a un caso
## [1] 81714
nrow(siseve23) #en este caso cada fila corresponde a un caso
## [1] 19788
Ahora que todos los casos pertenecen son del 2023, la variable
fecha
deja de ser relevante para mi analisis. Para eliminar
la variable:
siseve23.1 <- siseve23 %>%
select(-fecha)
names(siseve23.1)
## [1] "region" "ugel" "nivel_educativo"
## [4] "tipo_reporte" "tipo_violencia" "subtipo_violencia"
## [7] "estado_reporte"
Solo me interesa trabajar con las variables region
,
nivel_educativo
, tipo_violencia
siseve23.2 <- siseve23.1 %>%
select(region, nivel_educativo, tipo_violencia)
names(siseve23.2)
## [1] "region" "nivel_educativo" "tipo_violencia"
Este procedimiento hace mas sentido en bases de mas variables
Ejercicio 3: Crea una base de datos que solo incluya
informacion del nivel secundaria del año 2023.