Instalación de paquetes complementarios al R Base

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 sólo 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:\Program Files\R\R-3.5.0\library\, 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.

Lectura y escritura de archivos

.csv y .txt

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 parámetros:

  • encabezado
  • delimitador (,, tab, ;)
  • separador decimal
dataframe <- read.delim(file, header = TRUE, sep = "\t", quote = "\"", dec = ".", fill = TRUE, comment.char = "", ...) 

Ejemplo. Levantar la base de sueldos de funcionarios

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 ../

sueldos_funcionarios <- read.table(file = '../fuentes/sueldo_funcionarios_2019.csv',sep=",", header = TRUE)
sueldos_funcionarios[1:10,]

Como puede observarse aquí, la base cuenta con 94 registros y 10 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(sueldos_funcionarios)
names(sueldos_funcionarios)
 [1] "cuil"                       "anio"                      
 [3] "mes"                        "funcionario_apellido"      
 [5] "funcionario_nombre"         "repartición"               
 [7] "asignacion_por_cargo_i"     "aguinaldo_ii"              
 [9] "total_salario_bruto_i_._ii" "observaciones"             
summary(sueldos_funcionarios)
            cuil         anio           mes       funcionario_apellido
 20-13872301-2: 3   Min.   :2019   Min.   :1.00   ACUÑA     : 3       
 20-14699669-9: 3   1st Qu.:2019   1st Qu.:2.00   ASTARLOA  : 3       
 20-16891528-5: 3   Median :2019   Median :3.00   AVELLANEDA: 3       
 20-16891539-0: 3   Mean   :2019   Mean   :3.34   AVOGADRO  : 3       
 20-17110752-1: 3   3rd Qu.:2019   3rd Qu.:5.00   BENEGAS   : 3       
 20-17692128-6: 3   Max.   :2019   Max.   :6.00   BOU PEREZ : 3       
 (Other)      :76                                 (Other)   :76       
        funcionario_nombre
  ANA MARIA      : 3      
  BRUNO GUIDO    : 3      
  CHRISTIAN      : 3      
  DIEGO CESAR    : 3      
  DIEGO HERNAN   : 3      
  EDUARDO ALBERTO: 3      
 (Other)         :76      
                                                         repartición
 Consejo de los Derechos de Niñas, Niños y Adoles - Presidencia: 3  
 Ente de Turismo Ley Nº 2627                                   : 3  
 Jefatura de Gabinete de Ministros                             : 3  
 Jefe de Gobierno                                              : 3  
 Ministerio de Ambiente y Espacio Público                      : 3  
 Ministerio de Cultura                                         : 3  
 (Other)                                                       :76  
 asignacion_por_cargo_i  aguinaldo_ii    total_salario_bruto_i_._ii        observaciones
 Min.   :197746         Min.   :     0   Min.   :197746                           :93   
 1st Qu.:217520         1st Qu.:     0   1st Qu.:217805             baja 28/2/2019: 1   
 Median :226866         Median :     0   Median :226866                                 
 Mean   :224718         Mean   : 14843   Mean   :239560                                 
 3rd Qu.:231168         3rd Qu.:     0   3rd Qu.:248033                                 
 Max.   :249662         Max.   :113433   Max.   :340300                                 
                                                                                        
head(sueldos_funcionarios)[,1:5]

Excel

Para leer y escribir archivos excel podemos 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 = "../resultados/archivo.xlsx", row.names = FALSE)
Note: zip::zip() is deprecated, please use zip::zipr() instead
# 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 corresponderá al que definamos para cada Dataframe a la hora de crear la lista.
Lista_a_exportar <- list("sueldos funcionarios" = sueldos_funcionarios,
                         "Tabla Numeros" = tabla_de_R)

write.xlsx(x = Lista_a_exportar, file = "../resultados/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 = "../resultados/archivo_2_hojas.xlsx", sheet = "sueldos funcionarios")

# alternativamente podemos especificar el número de orden de la hoja que deseamos levantar
Indices_Salario <- read.xlsx(xlsxFile = "../resultados/archivo_2_hojas.xlsx", sheet = 1)
Indices_Salario[1:10,]
LS0tCnRpdGxlOiBJbnRyb2R1Y2Npw7NuIGEgUgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwpkYXRlOiAiIgpzdWJ0aXRsZTogUHLDoWN0aWNhIEd1aWFkYQotLS0KCiMjIyBJbnN0YWxhY2nDs24gZGUgcGFxdWV0ZXMgY29tcGxlbWVudGFyaW9zIGFsIFIgQmFzZSAgICAgICAgICAKCkhhc3RhIGFxdcOtIGhlbW9zIHZpc3RvIG3Dumx0aXBsZXMgZnVuY2lvbmVzIHF1ZSBlc3TDoW4gY29udGVuaWRhcyBkZW50cm8gZGVsIGxlbmd1YWplIGLDoXNpY28gZGUgUi4gQWhvcmEgYmllbiwgYWwgdHJhdGFyc2UgZGUgdW4gc29mdHdhcmUgbGlicmUsIGxvcyB1c3VhcmlvcyBkZSBSIGNvbiBtw6FzIGV4cGVyaWVuY2lhIGNvbnRyaWJ1eWVuIHNpc3RlbcOhdGljYW1lbnRlIGEgZXhwYW5kaXIgZXN0ZSBsZW5ndWFqZSBtZWRpYW50ZSBsYSBjcmVhY2nDs24geSBhY3R1YWxpemFjacOzbiBkZSBfX3BhcXVldGVzX18gY29tcGxlbWVudGFyaW9zLiBMw7NnaWNhbWVudGUsIGxvcyBtaXNtb3Mgbm8gZXN0w6FuIGluY2x1aWRvcyBlbiBsYSBpbnN0YWxhY2nDs24gaW5pY2lhbCBkZWwgcHJvZ3JhbWEsIHBlcm8gcG9kZW1vcyBkZXNjYXJnYXJsb3MgZSBpbnN0YWxhcmxvcyBhbCBtaXNtbyB0aWVtcG8gY29uIGVsIHNpZ3VpZW50ZSBjb21hbmRvOiAgIApgYGAgCmluc3RhbGwucGFja2FnZXMoIm5vbWJyZV9kZWxfcGFxdWV0ZSIpIApgYGAKUmVzdWx0YSByZWNvbWVuZGFibGUgX19lamVjdXRhciBlc3RlIGNvbWFuZG8gZGVzZGUgbGEgY29uc29sYV9fIHlhIHF1ZSBzw7NsbyBuZWNlc2l0YXJlbW9zIGNvcnJlcmxvIHVuYSB2ZXogZW4gbnVlc3RyYSBjb21wdXRhZG9yYS4gQWwgZWplY3V0YXIgZWwgbWlzbW8sIHNlIGRlc2NhcmdhcsOhbiBkZSBsYSBwYWdpbmEgZGUgW0NSQU5dKHd3dy5jcmFuLnItcHJvamVjdC5vcmcpIGxvcyBhcmNoaXZvcyBjb3JyZXNwb25kaWVudGVzIGFsIHBhcXVldGUgaGFjaWEgZWwgZGlyZWN0b3JpbyBlbiBkb25kZSBoYXlhbW9zIGluc3RhbGFkbyBlbCBwcm9ncmFtYS4gVMOtcGljYW1lbnRlIGxvcyBhcmNoaXZvcyBzZSBlbmNvbnRyYXLDoW4gZW4gX19gQzpcUHJvZ3JhbSBGaWxlc1xSXFItMy41LjBcbGlicmFyeVxgX18sIHNpZW1wcmUgY29uIGxhIHZlcnNpw7NuIGRlbCBwcm9ncmFtYSBjb3JyZXNwb25kaWVudGUuICAgICAgICAgICAgICAKVW5hIHZleiBpbnN0YWxhZG8gZWwgcGFxdWV0ZSwgY2FkYSB2ZXogcXVlIGFicmFtb3MgdW5hIG51ZXZhIHNlc2nDs24gZGUgUiB5IHF1ZXJyYW1vcyB1dGlsaXphciBlbCBtaXNtbyBkZWJlbW9zICoqY2FyZ2FybG8gYWwgYW1iaWVudGUgZGUgdHJhYmFqbyoqIG1lZGlhbnRlIGxhIHNpZ3VpZW50ZSBmdW5jacOzbjoKYGBgIApsaWJyYXJ5KG5vbWJyZV9kZWxfcGFxdWV0ZSkKYGBgCk7Ds3Rlc2UgcXVlIGFsIGNhcmdhci9hY3RpdmFyIGVsIHBhcXVldGUgbm8gc29uIG5lY2VzYXJpYXMgbGFzIGNvbWlsbGFzLgoKIyMjIExlY3R1cmEgeSBlc2NyaXR1cmEgZGUgYXJjaGl2b3MKCiMjIyMgLmNzdiAgeSAgLnR4dAoKSGF5IF9fbXVjaGFzX18gZnVuY2lvbmVzIHBhcmEgbGVlciBhcmNoaXZvcyBkZSB0aXBvIF8udHh0XyB5IF8uY3N2Xy4gTGEgbWF5b3LDrWEgc8OzbG8gY2FtYmlhIGxvcyBwYXLDoW1ldHJvcyBxdWUgdmllbmVuIHBvciBkZWZhdWx0LiAKCkVzIGltcG9ydGFudGUgdGVuZXIgZW4gY3VlbnRhIHF1ZSB1bmEgYmFzZSBkZSBkYXRvcyBxdWUgcHJvdmllbmUgZGUgYXJjaGl2b3MgXy50eHRfLCBvIF8uY3N2XyBwdWVkZSBwcmVzZW50YXIgZGlmZXJlbmNpYXMgZW4gY3VhbnRvIGEgbG9zIHNpZ3VpZW50ZXMgcGFyw6FtZXRyb3M6CgotIGVuY2FiZXphZG8KLSBkZWxpbWl0YWRvciAoYGBgLGBgYCwgdGFiLCBgYGA7YGBgKQotIHNlcGFyYWRvciBkZWNpbWFsIAoKCmBgYCAKZGF0YWZyYW1lIDwtIHJlYWQuZGVsaW0oZmlsZSwgaGVhZGVyID0gVFJVRSwgc2VwID0gIlx0IiwgcXVvdGUgPSAiXCIiLCBkZWMgPSAiLiIsIGZpbGwgPSBUUlVFLCBjb21tZW50LmNoYXIgPSAiIiwgLi4uKSAKYGBgCgpFamVtcGxvLiBMZXZhbnRhciBsYSBiYXNlIGRlIFtzdWVsZG9zIGRlIGZ1bmNpb25hcmlvc10oaHR0cHM6Ly9kYXRhLmJ1ZW5vc2FpcmVzLmdvYi5hci9kYXRhc2V0L3N1ZWxkby1mdW5jaW9uYXJpb3MpCgpFbiBlbCBwYXJhbWV0cm8gYGZpbGVgIHRlbmdvIHF1ZSBlc3BlY2lmaWNhciBlbCBub21icmUgY29tcGxldG8gZGVsIGFyY2hpdm8sIGluY2x1eWVuZG8gZWwgZGlyZWN0b3JpbyBkb25kZSBzZSBlbmN1ZW50cmEuIExvIG3DoXMgc2VuY2lsbG8gZXMgYWJyaXIgY29taWxsYXMsIGFwcmV0YXIgYFRhYmAgeSBzZSBkZXNwbGllZ2EgZWwgbWVuw7ogZGUgbGFzIGNvc2FzIHF1ZSB0ZW5lbW9zIGVuIGVsIGRpcmVjdG9yaW8gZGUgdHJhYmFqby4gU2kgcXVlcmVtb3MgbW92ZXJub3MgaGFjaWEgYXJyaWJhLCBhZ3JlZ2Ftb3MgYC4uL2AKCgpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnN1ZWxkb3NfZnVuY2lvbmFyaW9zIDwtIHJlYWQudGFibGUoZmlsZSA9ICcuLi9mdWVudGVzL3N1ZWxkb19mdW5jaW9uYXJpb3NfMjAxOS5jc3YnLHNlcD0iLCIsIGhlYWRlciA9IFRSVUUpCnN1ZWxkb3NfZnVuY2lvbmFyaW9zWzE6MTAsXQpgYGAKQ29tbyBwdWVkZSBvYnNlcnZhcnNlIGFxdcOtLCBsYSBiYXNlIGN1ZW50YSBjb24gOTQgcmVnaXN0cm9zIHkgMTAgdmFyaWFibGVzLiAgCkFsIHRyYWJhamFyIGNvbiBiYXNlcyBkZSBtaWNyb2RhdG9zLCByZXN1bHRhIGNvbnZlbmllbnRlIGNvbnRhciBjb24gYWxndW5vcyBjb21hbmRvcyBwYXJhIHRlbmVyIHVuYSBtaXJhZGEgcsOhcGlkYSBkZSBsYSBiYXNlLCBhbnRlcyBkZSBjb21lbnphciBhIHJlYWxpemFyIGxvcyBwcm9jZXNhbWllbnRvcyBxdWUgZGVzZWVtb3MuICAgICAKClZlYW1vcyBhbGd1bm9zIGRlIGVsbG9zOgoKYGBge3J9CiN2aWV3KHN1ZWxkb3NfZnVuY2lvbmFyaW9zKQpuYW1lcyhzdWVsZG9zX2Z1bmNpb25hcmlvcykKc3VtbWFyeShzdWVsZG9zX2Z1bmNpb25hcmlvcykKaGVhZChzdWVsZG9zX2Z1bmNpb25hcmlvcylbLDE6NV0KYGBgCgoKIyMjIyBFeGNlbCAKCgpQYXJhIGxlZXIgeSBlc2NyaWJpciBhcmNoaXZvcyBleGNlbCBwb2RlbW9zIHV0aWxpemFyIGxvcyBjb21hbmRvcyBxdWUgdmllbmVuIGNvbiBsYSBsaWJyZXLDrWEgX29wZW54bHN4XwoKYGBge3Isd2FybmluZz1GQUxTRX0KCiMgaW5zdGFsbC5wYWNrYWdlcygib3Blbnhsc3giKSAjIHBvciDDum5pY2EgdmV6CmxpYnJhcnkob3Blbnhsc3gpICNhY3RpdmFtb3MgbGEgbGlicmVyw61hCgojIGNyZWFtb3MgdW5hIHRhYmxhIGN1YWxxdWllcmEgZGUgcHJ1ZWJhCnggPC0gMToxMAp5IDwtIDExOjIwCnRhYmxhX2RlX1IgPC0gZGF0YS5mcmFtZSh4LHkpCgojIGVzY3JpYmltb3MgZWwgYXJjaGl2bwp3cml0ZS54bHN4KHggPSB0YWJsYV9kZV9SLCBmaWxlID0gIi4uL3Jlc3VsdGFkb3MvYXJjaGl2by54bHN4Iiwgcm93Lm5hbWVzID0gRkFMU0UpCiMgRG9uZGUgbG8gZ3VhcmTDsz8gSGF5IHVuIGRpcmVjdG9yaW8gcG9yIGRlZmF1bHQgZW4gY2FzbyBkZSBxdWUgbm8gaGF5YW1vcyBkZWZpbmlkbyBhbGd1bm8uCgojIGdldHdkKCkKCiMgU2kgcXVlcmVtb3MgZXhwb3J0YXIgbXVsdGlwbGVzIGRhdGFmcmFtZXMgYSB1biBFeGNlbCwgZGViZW1vcyBhcm1hciBwcmV2aWFtZW50ZSB1bmEgbGlzdGEgZGUgZWxsb3MuIENhZGEgZGF0YWZyYW1lIHNlIGd1YXJkYXLDoSBlbiB1bmEgcGVzdGHDsWEgZGUgZXhjZWwsIGN1eW8gbm9tYnJlIGNvcnJlc3BvbmRlcsOhIGFsIHF1ZSBkZWZpbmFtb3MgcGFyYSBjYWRhIERhdGFmcmFtZSBhIGxhIGhvcmEgZGUgY3JlYXIgbGEgbGlzdGEuCkxpc3RhX2FfZXhwb3J0YXIgPC0gbGlzdCgic3VlbGRvcyBmdW5jaW9uYXJpb3MiID0gc3VlbGRvc19mdW5jaW9uYXJpb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAiVGFibGEgTnVtZXJvcyIgPSB0YWJsYV9kZV9SKQoKd3JpdGUueGxzeCh4ID0gTGlzdGFfYV9leHBvcnRhciwgZmlsZSA9ICIuLi9yZXN1bHRhZG9zL2FyY2hpdm9fMl9ob2phcy54bHN4Iiwgcm93Lm5hbWVzID0gRkFMU0UpCgojIGxlZW1vcyBlbCBhcmNoaXZvIGVzcGVjaWZpY2FuZG8gbGEgcnV0YSAobyBlbCBkaXJlY3RvcmlvIHBvciBkZWZhdWx0KSB5IGVsIG5vbWJyZSBkZSBsYSBob2phIHF1ZSBjb250aWVuZSBsb3MgZGF0b3MKSW5kaWNlc19TYWxhcmlvIDwtIHJlYWQueGxzeCh4bHN4RmlsZSA9ICIuLi9yZXN1bHRhZG9zL2FyY2hpdm9fMl9ob2phcy54bHN4Iiwgc2hlZXQgPSAic3VlbGRvcyBmdW5jaW9uYXJpb3MiKQoKIyBhbHRlcm5hdGl2YW1lbnRlIHBvZGVtb3MgZXNwZWNpZmljYXIgZWwgbsO6bWVybyBkZSBvcmRlbiBkZSBsYSBob2phIHF1ZSBkZXNlYW1vcyBsZXZhbnRhcgpJbmRpY2VzX1NhbGFyaW8gPC0gcmVhZC54bHN4KHhsc3hGaWxlID0gIi4uL3Jlc3VsdGFkb3MvYXJjaGl2b18yX2hvamFzLnhsc3giLCBzaGVldCA9IDEpCkluZGljZXNfU2FsYXJpb1sxOjEwLF0KYGBgCgoK