Las notas del presente curso fueron elaboradas originalmente por Diego Kozlowski y Guido Weksler. En las sucesivas modificaciones colaboraron: Natsumi Shokida y Matías Lioni
El entorno más cómodo para utilizar el lenguaje R es el programa R studio
Rstudio es una empresa que produce productos asociados al lenguaje R, como el programa sobre el que corremos los comandos, y extensiones del lenguaje (librerías).
El programa es gratuito y se puede bajar de la página oficial
Los Objetos/Elementos constituyen la categoría escencial del R. De hecho, todo en R es un objeto, y se almacena con un nombre específico que no debe poseer espacios. Un número, un vector, una función, la progresión de letras del abecedario, una base de datos, un gráfico, constituyen para R objetos de distinto tipo. Los objetos que vamos creando a medida que trabajamos pueden visualizarse en la panel derecho superior de la pantalla.
El operador <-
sirve para definir un objeto. A la izquierda del <-
debe ubicarse el nombre que tomará el elemento a crear. Del lado derecho debe ir la definición del mismo
A <- 1
Al definir un elemento, el mismo queda guardado en el ambiente del programa, y podrá ser utilizado posteriormente para observar su contenido o para realizar una operación con el mismo
A
[1] 1
A+6
[1] 7
Al correr una linea con el nombre del objeto, la consola del programa nos muestra su contenido. Entre Corchetes Observamos el número de orden del elemento en cuestión
El operador =
es equivalente a <-
, pero en la práctica no se utiliza para la definición de objetos.
B = 2
B
[1] 2
<-
es un operador Unidireccional, es decir que:
A <- B
implica que A va tomar como valor el contenido del objeto B, y no al revés.
A <- B
A #Ahora A toma el valor de B, y B continua conservando el mismo valor
[1] 2
B
[1] 2
Con R base nos referimos a los comandos básicos que vienen incorporados en el R, sin necesidad de cargar librerías.
#Redefinimos los valores A y B
A <- 10
B <- 20
#Realizamos comparaciones lógicas
A > B
[1] FALSE
A >= B
[1] FALSE
A < B
[1] TRUE
A <= B
[1] TRUE
A == B
[1] FALSE
A != B
[1] TRUE
C <- A != B
C
[1] TRUE
Como muestra el último ejemplo, el resultado de una operación lógica puede almacenarse como el valor de un objeto.
#suma
A <- 5+6
A
[1] 11
#Resta
B <- 6-8
B
[1] -2
#cociente
C <- 6/2.5
C
[1] 2.4
#multiplicacion
D <- 6*2.5
D
[1] 15
Las funciones son series de procedimientos estandarizados, que toman como imput determinados argumentos a fijar por el usuario, y devuelven un resultado acorde a la aplicación de dichos procedimientos. Su lógica de funcionamiento es:
funcion(argumento1 = arg1, argumento2 = arg2)
A lo largo del curso iremos viendo numerosas funciones, según lo requieran los distintos ejercicios. Sin embargo, veamos ahora algunos ejemplos para comprender su funcionamiento:
paste("Pega","estas",4,"palabras", sep = " ")
[1] "Pega estas 4 palabras"
#Puedo concatenar caracteres almacenados en objetos
paste(A,B,C,sep = "**")
[1] "11**-2**2.4"
# Paste0 pega los caracteres sin separador
paste0(A,B,C)
[1] "11-22.4"
1:5
[1] 1 2 3 4 5
sum(1:5)
[1] 15
mean(1:5,na.rm = TRUE)
[1] 3
El numeral #
se utiliza para hacer comentarios. Todo lo que se escribe después del # no es interpretado por R. Se debe utilizar un # por cada línea de código que se desea anular
[]
se utilizan para acceder a un objeto:
el signo $ también es un método de acceso. Particularmente, en los dataframes, nos permitira acceder a una determinada columna de una tabla
Los paréntesis()
se utilizan en las funciones para definir los parámetros.
Las comas ,
se utilizan para separar los parametros al interior de una función.
Existen un gran cantidad de objetos distintos en R, en lo que resepcta al curso trabajaremos principalmente con 3 de ellos:
Los valores y vectores pueden ser a su vez de distintas clases:
Numeric
A <- 1
class(A)
[1] "numeric"
Character
A <- paste('Soy', 'una', 'concatenación', 'de', 'caracteres', sep = " ")
A
[1] "Soy una concatenación de caracteres"
class(A)
[1] "character"
Factor
A <- factor("Soy un factor, con niveles fijos")
class(A)
[1] "factor"
La diferencia entre un character y un factor es que el último tiene solo algunos valores permitidos (levels), con un orden interno predefinido (el cual ,por ejemplo, se respetará a la hora de realizar un gráfico)
Para crear un vector utilizamos el comando c()
, de combinar.
C <- c(1, 3, 4)
C
[1] 1 3 4
sumarle 2 a cada elemento del vector anterior
C <- C + 2
C
[1] 3 5 6
sumarle 1 al primer elemento, 2 al segundo, y 3 al tercer elemento del vector anterior
D <- C + 1:3 #esto es equivalente a hacer 3+1, 5+2, 6+9
D
[1] 4 7 9
1:3
significa que queremos todos los números enteros desde 1 hasta 3.
crear un vector que contenga las palabras: “Carlos”,“Federico”,“Pedro”
E <- c("Carlos","Federico","Pedro")
E
[1] "Carlos" "Federico" "Pedro"
para acceder a algún elemento del vector, podemos buscarlo por su número de orden, entre [ ]
E[2]
[1] "Federico"
Si nos interesa almacenar dicho valor, al buscarlo lo asignamos a un nuevo objeto, dandole el nombre que deseemos
elemento2 <- E[2]
elemento2
[1] "Federico"
para borrar un objeto del ambiente de trabajo, utilizamos el comando rm()
rm(elemento2)
elemento2
Error: object 'elemento2' not found
También podemos cambiar el texto del segundo elemento de E, por el texto “Pablo”
E[2] <- "Pablo"
E
[1] "Carlos" "Pablo" "Pedro"
Un Data Frame es una tabla de datos, donde cada columna representa una variable, y cada fila una observación.
Este objeto suele ser central en el proceso de trabajo, y suele ser la forma en que se cargan datos externos para trabajar en el ambiente de R, y en que se exportan los resultados de nuestros trabajo.
También Se puede crear como la combinación de N vectores de igual tamaño. Por ejemplo, tomamos algunos valores del Indice de salarios
INDICE <- c(100, 100, 100,
101.8, 101.2, 100.73,
102.9, 102.4, 103.2)
FECHA <- c("Oct-16", "Oct-16", "Oct-16",
"Nov-16", "Nov-16", "Nov-16",
"Dic-16", "Dic-16", "Dic-16")
GRUPO <- c("Privado_Registrado","Público","Privado_No_Registrado",
"Privado_Registrado","Público","Privado_No_Registrado",
"Privado_Registrado","Público","Privado_No_Registrado")
Datos <- data.frame(INDICE, FECHA, GRUPO)
Datos
Tal como en un vector se ubica a los elementos mediante [ ]
, en un dataframe se obtienen sus elementos de la forma [fila, columna]
.
Otra opción es especificar la columna, mediante el operador $
, y luego seleccionar dentro de esa columna el registro deseado mediante el número de orden.
Datos$FECHA
[1] Oct-16 Oct-16 Oct-16 Nov-16 Nov-16 Nov-16 Dic-16 Dic-16 Dic-16
Levels: Dic-16 Nov-16 Oct-16
Datos[3,2]
[1] Oct-16
Levels: Dic-16 Nov-16 Oct-16
Datos$FECHA[3]
[1] Oct-16
Levels: Dic-16 Nov-16 Oct-16
¿que pasa si hacemos Datos$FECHA[3,2]
?
Datos$FECHA[3,2]
Error in `[.default`(Datos$FECHA, 3, 2) : incorrect number of dimensions
Nótese que el último comando tiene un número incorrecto de dimensiones, porque estamos refiriendonos 2 veces a la columna FECHA.
Acorde a lo visto anteriormente, el acceso a los dataframes mediante [ ]
, puede utilizarse para realizar filtros sobre la base, especificando una condición para las filas. Por ejemplo, puedo utilizar los [ ]
para conservar del dataframe Datos
unicamente los registros con fecha de Diciembre 2016:
Datos[Datos$FECHA=="Dic-16",]
La lógica del paso anterior sería: Accedo al dataframe Datos
, pidiendo únicamente conservar las filas (por eso la condición se ubica a la izquierda de la ,
) que cumplan el requisito de pertenecer a la categoría “Dic-16” de la variable FECHA.
Aún más, podría aplicar el filtro y al mismo tiempo identificar una variable de interés para luego realizar un cálculo sobre aquella. Por ejemplo, podría calcular la media de los indices en el mes de Diciembre.
###Por separado
Indices_Dic <- Datos$INDICE[Datos$FECHA=="Dic-16"]
Indices_Dic
[1] 102.9 102.4 103.2
mean(Indices_Dic)
[1] 102.8333
### Todo junto
mean(Datos$INDICE[Datos$FECHA=="Dic-16"])
[1] 102.8333
La lógica de esta sintaxis sería: “Me quedó con la variable INDICE, cuando la variable FECHA sea igual a “Dic-16”, luego calculo la media de dichos valores”
Contienen una concatenación de objetos de cualquier tipo. Así como un vector contiene valores, un dataframe contiene vectores, una lista puede contener dataframes, pero también vectores, o valores, y todo ello a la vez
superlista <- list(A,B,C,D,E,FECHA, DF = Datos, INDICE, GRUPO)
superlista
[[1]]
[1] Soy un factor, con niveles fijos
Levels: Soy un factor, con niveles fijos
[[2]]
[1] -2
[[3]]
[1] 3 5 6
[[4]]
[1] 4 7 9
[[5]]
[1] "Carlos" "Pablo" "Pedro"
[[6]]
[1] "Oct-16" "Oct-16" "Oct-16" "Nov-16" "Nov-16" "Nov-16" "Dic-16" "Dic-16" "Dic-16"
$DF
[[8]]
[1] 100.00 100.00 100.00 101.80 101.20 100.73 102.90 102.40 103.20
[[9]]
[1] "Privado_Registrado" "Público" "Privado_No_Registrado"
[4] "Privado_Registrado" "Público" "Privado_No_Registrado"
[7] "Privado_Registrado" "Público" "Privado_No_Registrado"
Para acceder un elemento de una lista, podemos utilizar el operador $
, que se puede usar a su vez de forma iterativa
superlista$DF$FECHA[2]
[1] Oct-16
Levels: Dic-16 Nov-16 Oct-16
Hasta aquí hemos visto múltiples funciones que están contenidas dentro del lenguaje básico de R. Ahora bien, al tratarse de un software libre, los usuarios de R con más experiencia contribuyen sistemáticamente a expandir este lenguaje mediante la creación y actualización de paquetes complementarios. Lógicamente, los mismos no están incluidos en la instalación inicial del programa, pero podemos descargarlos e instalarlos al mismo tiempo con el siguiente comando:
install.packages("nombre_del_paquete")
Resulta recomendable ejecutar este comando desde la consola ya que solo necesitaremos correrlo una vez en nuestra computadora. Al ejecutar el mismo, se descargarán de la pagina de CRAN los archivos correspondientes al paquete hacia el directorio en donde hayamos instalado el programa. Típicamente los archivos se encontrarán en **C:Files-3.5.0**, siempre con la versión del programa correspondiente.
Una vez instalado el paquete, cada vez que abramos una nueva sesión de R y querramos utilizar el mismo debemos cargarlo al ambiente de trabajo mediante la siguiente función:
library(nombre_del_paquete)
Nótese que al cargar/activar el paquete no son necesarias las comillas.
Hay muchas funciones para leer archivos de tipo .txt y .csv. La mayoría sólo cambia los parámetros que vienen por default.
Es importante tener en cuenta que una base de datos que proviene de archivos .txt, o .csv puede presentar diferencias en cuanto a los siguientes parametros:
,
, tab, ;
)dataframe <- read.delim(file, header = TRUE, sep = "\t", quote = "\"", dec = ".", fill = TRUE, comment.char = "", ...)
Ejemplo. Levantar la base individual de EPH del 1er trimestre 2017
En el parametro file
tengo que especificar el nombre completo del archivo, incluyendo el directorio donde se encuentra. Lo más sencillo es abrir comillas, apretar Tab
y se despliega el menú de las cosas que tenemos en el directorio de trabajo. Si queremos movernos hacia arriba, agregamos ../
individual_t117 <- read.table(file = '../Fuentes/usu_individual_t117.txt',sep=";", dec=",", header = TRUE, fill = TRUE)
individual_t117
Como puede observarse aquí, las bases individuales de la EPH cuentan con más de 58.000 registros y 177 variables. Al trabajar con bases de microdatos, resulta conveniente contar con algunos comandos para tener una mirada rápida de la base, antes de comenzar a realizar los procesamientos que deseemos.
Veamos algunos de ellos:
#View(individual_t117)
names(individual_t117)
[1] "CODUSU" "ANO4" "TRIMESTRE" "NRO_HOGAR" "COMPONENTE" "H15"
[7] "REGION" "MAS_500" "AGLOMERADO" "PONDERA" "CH03" "CH04"
[13] "CH05" "CH06" "CH07" "CH08" "CH09" "CH10"
[19] "CH11" "CH12" "CH13" "CH14" "CH15" "CH15_COD"
[25] "CH16" "CH16_COD" "NIVEL_ED" "ESTADO" "CAT_OCUP" "CAT_INAC"
[31] "IMPUTA" "PP02C1" "PP02C2" "PP02C3" "PP02C4" "PP02C5"
[37] "PP02C6" "PP02C7" "PP02C8" "PP02E" "PP02H" "PP02I"
[43] "PP03C" "PP03D" "PP3E_TOT" "PP3F_TOT" "PP03G" "PP03H"
[49] "PP03I" "PP03J" "INTENSI" "PP04A" "PP04B_COD" "PP04B1"
[55] "PP04B2" "PP04B3_MES" "PP04B3_ANO" "PP04B3_DIA" "PP04C" "PP04C99"
[61] "PP04D_COD" "PP04G" "PP05B2_MES" "PP05B2_ANO" "PP05B2_DIA" "PP05C_1"
[67] "PP05C_2" "PP05C_3" "PP05E" "PP05F" "PP05H" "PP06A"
[73] "PP06C" "PP06D" "PP06E" "PP06H" "PP07A" "PP07C"
[79] "PP07D" "PP07E" "PP07F1" "PP07F2" "PP07F3" "PP07F4"
[85] "PP07F5" "PP07G1" "PP07G2" "PP07G3" "PP07G4" "PP07G_59"
[91] "PP07H" "PP07I" "PP07J" "PP07K" "PP08D1" "PP08D4"
[97] "PP08F1" "PP08F2" "PP08J1" "PP08J2" "PP08J3" "PP09A"
[103] "PP09A_ESP" "PP09B" "PP09C" "PP09C_ESP" "PP10A" "PP10C"
[109] "PP10D" "PP10E" "PP11A" "PP11B_COD" "PP11B1" "PP11B2_MES"
[115] "PP11B2_ANO" "PP11B2_DIA" "PP11C" "PP11C99" "PP11D_COD" "PP11G_ANO"
[121] "PP11G_MES" "PP11G_DIA" "PP11L" "PP11L1" "PP11M" "PP11N"
[127] "PP11O" "PP11P" "PP11Q" "PP11R" "PP11S" "PP11T"
[133] "P21" "DECOCUR" "IDECOCUR" "RDECOCUR" "GDECOCUR" "PDECOCUR"
[139] "ADECOCUR" "PONDIIO" "TOT_P12" "P47T" "DECINDR" "IDECINDR"
[145] "RDECINDR" "GDECINDR" "PDECINDR" "ADECINDR" "PONDII" "V2_M"
[151] "V3_M" "V4_M" "V5_M" "V8_M" "V9_M" "V10_M"
[157] "V11_M" "V12_M" "V18_M" "V19_AM" "V21_M" "T_VI"
[163] "ITF" "DECIFR" "IDECIFR" "RDECIFR" "GDECIFR" "PDECIFR"
[169] "ADECIFR" "IPCF" "DECCFR" "IDECCFR" "RDECCFR" "GDECCFR"
[175] "PDECCFR" "ADECCFR" "PONDIH"
summary(individual_t117)[,c(8,10,31,133)]
MAS_500 PONDERA IMPUTA P21
N:31790 Min. : 25.0 Min. :0.000000 Min. : -9
S:26885 1st Qu.: 137.0 1st Qu.:0.000000 1st Qu.: 0
Median : 238.0 Median :0.000000 Median : 0
Mean : 467.3 Mean :0.002727 Mean : 3671
3rd Qu.: 541.0 3rd Qu.:0.000000 3rd Qu.: 4800
Max. :7001.0 Max. :1.000000 Max. :300000
head(individual_t117)[,1:5]
Para leer y escribir archivos excel debemos utilizar los comandos que vienen con la librería openxlsx
# install.packages("openxlsx") # por única vez
library(openxlsx) #activamos la librería
#creamos una tabla cualquiera de prueba
x <- 1:10
y <- 11:20
tabla_de_R <- data.frame(x,y)
# escribimos el archivo
write.xlsx( x = tabla_de_R, file = "archivo.xlsx",row.names = FALSE)
#Donde lo guardó? Hay un directorio por default en caso de que no hayamos definido alguno.
#getwd()
#Si queremos exportar multiples dataframes a un Excel, debemos armar previamente una lista de ellos. Cada dataframe, se guardará en una pestaña de excel, cuyo nombre correspondera al que definamos para cada Dataframe a la hora de crear la lista.
Lista_a_exportar <- list("Indices Salarios" = Datos,
"Tabla Numeros" = tabla_de_R)
write.xlsx( x = Lista_a_exportar, file = "archivo_2_hojas.xlsx",row.names = FALSE)
#leemos el archivo especificando la ruta (o el directorio por default) y el nombre de la hoja que contiene los datos
Indices_Salario <- read.xlsx(xlsxFile = "archivo_2_hojas.xlsx",sheet = "Indices Salarios")
#alternativamente podemos especificar el número de orden de la hoja que deseamos levantar
Indices_Salario <- read.xlsx(xlsxFile = "archivo_2_hojas.xlsx",sheet = 1)
Indices_Salario
Hay algunas cosas que tenemos que tener en cuenta respecto del orden del ambiente en el que trabajamos:
getwd()
, es hacia donde apunta el código, por ejemplo, si quieren leer un archivo, la ruta del archivo tiene que estar explicitada como el recorrido desde el Working Directory.Es importante que mantengamos bien delimitadas estas cosas entre diferentes trabajos, sino:
Rstudio tiene una herramienta muy útil de trabajo que son los proyectos. Estos permiten mantener un ambiente de trabajo delimitado por cada uno de nuestros trabajos. Es decir:
Un proyecto no es un sólo script, sino toda una carpeta de trabajo.
Para crearlo, vamos al logo de nuevo projecto (Arriba a la izquierda de la panatalla), y elegimos la carpeta de trabajo.
Para quienes esten trabajando con sus computadoras personales, dejamos a continuación un listado de los paquetes complementarios del R base que utilizaremos a lo largo del curso. Como la instalación requiere descargar múltiples archivos de internet recomendamos hacerlo cuando dispongan de una buena conexión. Con el siguiente comando podrían instalarlos todos de una vez:
install.packages(c("tidyverse","openxlsx",'ggplot2','ggthemes', 'ggrepel','ggalt','kableExtra'))
Reiniciar R (
Session --> Restart R
)
Crear un dataframe DFRAME como combinación de todos los vectores creados previamente
Crear un nuevo script en la carpeta de la clase 1 nombrado “Nombre_Alumno_Tarea_C1.R”, y realizar los siguientes procedimientos:
Crear un objeto llamado OTRA_COSA que guarde el valor contenido en la segunda fila y tercera columna del dataframe DATAF
Levantar del Excel llamado CANASTAS que se encuentra en la carpeta de Fuentes, la hoja “CBA” y definirla como HojaCBA.