Está en la página 1de 8

Introducción a R

FACULTAD DE CIENCIAS SOCIALES - PUCP

Curso: POL 278 - Estadística para el análisis político 1 | Semestre 2022 - 2

Introducción a R
Vamos a hablar de tres estructuras de datos en R:
1. Listas
2. Vectores
3. Data Frames
4. Descriptivos
Listas y vectores son estructuras simples; mientras que una data frame es una estructura compleja, construida
en base a las estructuras simples.

1. Listas
Una lista es un contenedor de valores. Estos valores pueden ser de cualquier tipo (numéricas o no-numéricas).
Tomando como referencia a una hoja de cálculo, una fila podría ser una lista!
alumnos=list(nombre="MG",
edad=28,
PC1=F)

alumnos #veamos el resultado

Explorar la estructura de nuestros datos:


str(alumnos)

Acceder a elementos individuales:


alumnos[1]
# or
alumnos["nombre"]
# or
alumnos$nombre

Acceder a más elementos:


alumnos[c("nombre", "PC1")]

Reemplazar elementos:

1
alumnos$nombre="Juan"
# Cambio:
alumnos

Insertar nuevos elementos:


alumnos$ciudad="Lima"
alumnos

Eliminar elementos de la lista:


alumnos= alumnos[-2] ##si quisiera eliminar más de un elemento utilizo la c: alumnos[-c(2,3)]
alumnos

2. Vectores
Los vectores también son contenedores de valores. Todos estos valores deben ser del mismo tipo. Tomando
como referencia a una hoja de cálculo, una columna puede ser un vector.
nombre=c("Maria", "Hans", "Luisa", "Juan")
edad=c(19,20,22,22)
PC1=c(T,T,F,F)

Cada objeto almacena temporalmente a los vectores:


nombre #ver objeto
edad #ver objeto
PC1 #ver objeto

Cada vector está compuesto de elementos del mismo tipo. Para acceder a elementos individuales:
nombre[2]
edad[2]
PC1[2]

Se puede alterar un vector utilizando el siguiente mecanismo:


nombre[1]="Piero"

Insertar nuevos elementos:


nombre=c(nombre, "Miguel")

Para eliminar:
nombre=nombre[-5]
nombre #ver objeto ¿Cómo hago para eliminar más de un elemento?

Eliminar objetos repetidos:


edad_nueva=unique(edad)
edad #veamos original
edad_nueva #veamos cambio

Ver tipo de datos:


str(edad_nueva)

Ordenar vectores:

2
edad_ordenada=sort(edad, decreasing = T) #¿qué pasa si quitamos el argumento decreasing?
edad_ordenada #resultado

Tamaño del vector:


length(edad_ordenada)

Go to page beginning

3. Data Frames
Las Data Frames son contenedores de valores. Se utlizan cuando necesitamos combinar vectores con listas.
La analogía más común es la hoja de cálculo.
#vectores
nombre=c("Maria", "Miguel", "Diana", "Fernanda", "Hans", "Piero", "Katherine", "Alejandra", "Noelia")
edad=c("33",NA,"21","19","18","22","23","25",NA)
ciudad=c("Lima", "Lima", "Cajamarca", "Huancayo", "Trujillo", "Cusco", "Lima", "Cusco", "Cajamarca")
nota_PC1= c(18,16,15,12,14,NA,19,10,NA)

#Data Frame como una "lista" de vectores


alumnos=data.frame(nombre, edad, ciudad, nota_PC1, stringsAsFactors = F)

alumnos

Hay que revisar los datos:


str(alumnos)

Exploremos dimensiones de la data frame:


nrow(alumnos) #filas
ncol(alumnos) #columnas

Length nos da el número de columnas. ¿Cuál es la diferencia con length para vectores y listas?
length(alumnos)

Estas son las variables que tenemos en la data frame:


names(alumnos)

Ver primeros casos:


head(alumnos) #recuerden que podemos personalizar head

Ver últimos casos:


tail(alumnos) #tail también se puede personalizar

Para buscar elementos debemos tomar en cuenta la estructura de una data frame: data[fila, columna]
alumnos$nombre

## [1] "Maria" "Miguel" "Diana" "Fernanda" "Hans" "Piero"


## [7] "Katherine" "Alejandra" "Noelia"
alumnos[,c("nombre")]

## [1] "Maria" "Miguel" "Diana" "Fernanda" "Hans" "Piero"

3
## [7] "Katherine" "Alejandra" "Noelia"
alumnos[,c(1)]

## [1] "Maria" "Miguel" "Diana" "Fernanda" "Hans" "Piero"


## [7] "Katherine" "Alejandra" "Noelia"
#el output de la busqueda de UNA variable es un vector!

Dos columnas:
alumnos[,c("edad", "ciudad")] #dos columnas, formato dataframe

alumnos[,c(1,2)] #dos columnas si sabemos su posición

Utilizar posiciones es la mejor forma de obtener multiples columnas:


alumnos[,c(1:3)]

Podemos crear nuevos objetos con estos subsets:


alumnosSub = alumnos[,c(1:3)]

La misma lógica aplica para la búsqueda de filas, solo cambia la posición de la coma:
alumnos[1,] #toda la información de Maria

## nombre edad ciudad nota_PC1


## 1 Maria 33 Lima 18
alumnos[c(4:6),] #filas 4 a 6

## nombre edad ciudad nota_PC1


## 4 Fernanda 19 Huancayo 12
## 5 Hans 18 Trujillo 14
## 6 Piero 22 Cusco NA
Se pueden modificar todos los elementos de una data frame. Puedo modificar la edad de Maria:
alumnos[1,2]=19
alumnos[1,] #el cambio es inmediato (sin advertencia)

Regresando a str, vemos que edad está como factor..


str(alumnos$edad)

Operaciones como esta no funcionarian, por lo que es necesario hacer LIMPIEZA DE DATOS:
mean(alumnos$edad)

## Warning in mean.default(alumnos$edad): argument is not numeric or logical:


## returning NA
Cambiar variable a numérica:
alumnos$edad = as.numeric(alumnos$edad)
str(alumnos$edad)
#Vuelvan a intentar sacar la media, ahora funciona!

Ahora si:
mean(alumnos$edad, na.rm=T) #añadimos indicación de eliminar perdidos

Go to page beginning

4
Merge!
Creemos una nueva data frame:
#vectores
nombre=c("Maria", "Miguel", "Diana", "Fernanda", "Hans", "Piero", "Katherine", "Alejandra", "Noelia")
nota_PC2=c(14,17,18,13,15,16,17,11,20)

#Data Frame como una "lista" de vectores


alumnos2=data.frame(nombre, nota_PC2, stringsAsFactors = F)

alumnos2

Juntamos la información de todos los alumnos


alumnos_total = merge(alumnos, alumnos2, by="nombre")

alumnos_total

Nota: Merge junta data frames en base a columnas (añadimos variables a nuestros casos). En caso quisieramos
juntar filas (añadir casos a nuestras variables) utilizamos rbind.
Ponemos el nombre en el indice de la data:
row.names(alumnos_total)=alumnos_total$nombre
alumnos_total = alumnos_total[-c(1)]#ya no necesito la variable, la elimino.

alumnos_total

##Operaciones básicas con data frames


Nota máxima en la PC1:
alumnos_total[which.max(alumnos_total$nota_PC1),]

#¿Cómo sería la nota minima?


#¿Qué pasa si solo quiero averiguar su nombre?

¿Cuál fue la nota en la PC1 de los alumnos de Lima?


alumnos_total[alumnos_total$ciudad == "Lima",]$nota_PC1

Subset con alumnos de Lima con nota mayor a 16 en PC2


alumnosSub = alumnos_total[alumnos_total$ciudad == "Lima" & alumnos_total$nota_PC2 > 16,]

alumnosSub

Eliminar casos que tienen valores perdidos en una columna especifica:


alumnos_total[!is.na(alumnos_total$nota_PC1),]

Alternativa para eliminar los casos que tienen valores perdidos en cualquiera de las columnas:
alumnos_total[complete.cases(alumnos_total),] #guardo en un subset!

Aplicar funciones:
Veamos el promedio de notas por alumno:
Si quiero convertir mis variables a numéricas de manera simultanea:

5
alumnos_total[c(3,4)] = lapply(alumnos_total[c(3,4)], as.numeric)

Media por grupo:


aggregate(cbind(nota_PC1, nota_PC2) ~ ciudad,data=alumnos_total,FUN=mean)

Go to page beginning

4. Análisis descriptivo en R
library(rio)
data=import("Mosteller.csv")

Esta base de datos pertenece al siguiente paper https://pubmed.ncbi.nlm.nih.gov/8528684/ Mosteller (1995)


realizó un estudio longitudinal sobre el impacto del tamaño de la clase en los primeros grados escolares,
sobre el desempeño estudiantil y el desarrollo personal. Un estudio longitudinal es aquel en el que se hace
un seguimiento a participantes a lo largo del tiempo. Este estudio en concreto duró de 1985 a 1989 y en
él participaron 11.601 estudiantes. Durante los cuatro años del estudio, los estudiantes fueron asignados
aleatoriamente a clases pequeñas, a clases de tamaño normal o a clases de tamaño normal con ayuda. Aunque
el programa se detuvo en 1989 después de que la primera clase de jardín de infancia del programa terminara
el tercer grado, la recopilación de información (por ejemplo, el rendimiento en los exámenes de octavo grado,
el promedio general de la escuela secundaria) continuó hasta el final de la asistencia de los participantes a la
escuela secundaria.
¿Por qué son importantes este tipo de estudios? Porque constituyen evidencia para los tomadores de decisión
de política pública. Pensemos que esto puede contribuir a definir si la política educativa debe apostar por
salones de clases con grupos pequeños o no, pensando en fortalecer las competencias de los estudiantes.
No obstante, para esta sesión no vamos a examinar las hipótesis o resultados del trabajo de Mosteller (1995),
pero sí vamos a utilizar parte de su base de datos para el análisis descriptivo.
Exploramos las variables que tiene nuestra base de datos:
chr, factor, ordered factor, num, int
names(data)

## [1] "race" "classtype" "yearssmall" "hsgrad" "g4math"


## [6] "g4reading"
str(data)

## 'data.frame': 1600 obs. of 6 variables:


## $ race : int 1 1 1 1 1 1 1 1 1 1 ...
## $ classtype : int 3 1 2 1 1 1 2 3 2 3 ...
## $ yearssmall: int 0 4 0 4 4 4 0 0 0 0 ...
## $ hsgrad : int 1 1 1 1 1 1 1 1 0 1 ...
## $ g4math : int 711 709 698 740 771 709 698 673 744 731 ...
## $ g4reading : int 750 725 692 836 725 761 778 665 735 698 ...
El contenido de cada variable lo podemos ver en la siguiente tabla:

6
4.1. Configuración de las variables
Siempre antes de comenzar a realizar nuestro análisis, debemos identificar la estructura de las variables y
verificar que estén bien “configuradas”. Es decir que la escala de la variable coincida con el objeto en R.
De “race”
table(data$race) #Exploramos frecuencias

##
## 1 2 3 6
## 1383 211 5 1
class(data$race) #Exploramos el formato de la variable

## [1] "integer"
data$race = factor(data$race, levels = c(1:6), labels = c("white","black","asian","hispanic","native ame
table(data$race)

##
## white black asian hispanic native american
## 1383 211 5 0 0
## others
## 1
class(data$race)

## [1] "factor"
De “classtype”:
class(data$classtype)

## [1] "integer"
table(data$classtype)

##
## 1 2 3
## 481 578 541
data$classtype = factor(data$classtype, levels = c(1:3), labels = c("small","regular","regular with aid"
str(data$classtype)

## Factor w/ 3 levels "small","regular",..: 3 1 2 1 1 1 2 3 2 3 ...


table(data$classtype)

##
## small regular regular with aid
## 481 578 541

7
De “hsgrad”
class(data$hsgrad)

## [1] "integer"
table(data$hsgrad)

##
## 0 1
## 158 1442
data$hsgrad = factor(data$hsgrad, levels = c(0:1), labels = c("did not graduate","did graduate")) #ojo c
table(data$hsgrad)

##
## did not graduate did graduate
## 158 1442
str(data$hsgrad)

## Factor w/ 2 levels "did not graduate",..: 2 2 2 2 2 2 2 2 1 2 ...


“g4math”, “g4reading”, “yearssmall” son variables numéricas y están configuradas como vectores
numéricos de números enteros (integer) por lo cual lo dejamos así.

Moda, media y mediana


Entonces, una vez configurados adecuadamente nuestros objetos, pidamos los estadísticos de tendencia
central para nuestras variables.
Antes instalamos algunos paquetes que utilizaremos
• install.packages(“DescTools”) para pedir los estadísticos de tendencia central
• install.packages(“e1071”) para asimetría y curtosis
Las variables solicitadas son race, classtype y hsgrad
Para “race” podemos:
library(DescTools)
Mode(data$race) #este comando nos permitirá calcular la moda

## [1] white
## attr(,"freq")
## [1] 1383
## Levels: white black asian hispanic native american others
Para “g4math” podemos:
library(DescTools)
mean(data$g4math) #este comando nos permitirá calcular la media

## [1] 712.7094
Para “g4math” podemos:
library(DescTools)
median(data$g4math) #este comando nos permitirá calcular la mediana

## [1] 712

También podría gustarte