Bienvenidas y bienvenidos al curso Introducción a R para RRHH 👩💻. R es un lenguaje open source, es decir que es abierto, gratuito, y que además la comunidad de usuarias y usuarios contribuye a su mantenimiento.
Trabajar con proyectos en RStudio hace que todo el trabajo sea más sencillo. Los proyectos crean una carpeta en nuestra PC en donde se almacenarán los archivos, tablas, scripts, y hace que todo sea más organizado.
Para crear un proyecto tenés podés entrar en: * File * New project
Y luego poner el nombre de la carpeta.
Se abre una ventana, hacemos click en New Project, luego en Ok y finalmente en la tercera ventana podemos darle un nombre al proyecto, y asignar la carpeta en la que queremos guardarlo con el botón Browse.
Por definición, R es un lenguaje orientado a objetos. Esto significa que a una tabla, un valor, una variable, etc. le voy a poner un nombre, y esa cosa que ahora tiene nombre se llama objeto.
Esto nos simplifica un montón la vida. La asignación la hacemos con
el símbolo <- que simula una flecha hacia la izquierda.
También se puede hacer con el símbolo = pero como muchas
veces lo utilizamos para configurar un parámetro de una función usamos
“la flechita”.
# Esto es un comentario
objeto_1 <- 1979
objeto_2 <- 2021
# Para ver el resultado del objeto uso las teclas Ctrl + Enter
# También puedo usar el ícono "Run"
objeto_1## [1] 1979
# Podemos hacer operaciones con objetos
objeto_2 - objeto_1## [1] 42
Uno de los objetos más utilizados son los vectores
que son conjuntos de valores, numéricos, de texto, o combinados. Para
crear un vector necesitamos usar la función c() que
significa combine.
Los vectores pueden tener texto o número.
# Vector de Texto
nombre <- c("Gustavo", "Charly", "Zeta") # Las variables de texto van siempre con comillas.
# Ver el contenido
nombre## [1] "Gustavo" "Charly" "Zeta"
# Seleccionar un elemento del vector
nombre[2]## [1] "Charly"
# Vector numérico
anio_nacimiento <- c(1959, 1963, 1958)Los vectores son muy utilizados para filtrar elementos, cambiar nombres de tablas, etc..
Los data frames son tables que contienen filas (observaciones) y columnas (variables).
Podemos crear un data frame usando vectores que tengan la
misma cantidad de elementos usando la función
data.frame(). Dentro de la función podemos poner los
nombres
# Crear el data frame soda_stereo usando los vectores nombre y anio_nacimiento
soda_stereo <- data.frame(nombre, anio_nacimiento)
# Seleccionar elementos de un vector usando la sintaxis: nombre_dataframe[fila, columna]
soda_stereo[2,1]## [1] "Charly"
Normalmente los data frames los cargamos de algún archivo. Por
ejemplo, carguemos el archivo rotacion.csv usando la
función read.csv.
# Crear un objeto llamado rotacion leyendo el archivo rotacion.csv
rotacion <- read.csv("rotacion.csv",
sep = ";")
# Ver el contenido del data frame
rotacion # Ctrl + Enter## Periodo Movimientos Cantidades
## 1 2010 Ingresos 9
## 2 2010 Egresos 2
## 3 2011 Ingresos 84
## 4 2011 Egresos 14
## 5 2012 Ingresos 44
## 6 2012 Egresos 17
## 7 2013 Ingresos 44
## 8 2013 Egresos 15
## 9 2014 Ingresos 60
## 10 2014 Egresos 14
## 11 2015 Ingresos 36
## 12 2015 Egresos 27
## 13 2016 Ingresos 14
## 14 2016 Egresos 14
Si bien a los objetos podemos nombrarlos de cualquier manera, hay buenas prácticas recomendadas. Por ejemplo:
_) o el punto (.).# Nombres válidos de objetos
## Mejores opciones
respuestas_clima
respuestas.clima
# Esto funciona pero es menos recomendable
RespuestasClimaPor otro lado:
Los paquetes o librerías son extensiones desarrolladas por la comunidad o por empresas que facilitan el uso de R y expanden sus capacidades. En este encuentro vamos a usar los siguientes paquetes:
readxl: Desarrollado por Hadley Wickham and Jennifer
Bryan. Link a la
web.openxlsx: Desarrollado por Philipp Schauberger and
Alexander Walker. Link a la
web.tidyverse: Desarrollado por Hadley Wickham y muchos
más. Link a la web.Este último paquete, tidyverse es una colección de
paquetes que permiten realizar muchas tareas de exploración, limpieza y
transformación de datos.
Para utilizar un paquete, lo primero que tenemos que hacer es
instalarlos. Eso lo hacemos con la función
install.packages() y dentro del paréntesis tenemos que
poner el nombre del paquete. Tengan en cuenta que:
R es un lenguaje case sensitive o sea que hay que prestar atención a mayúsculas y minúsculas.
Para instalar los paquetes hay que usar comillas
Este es un paso que hacemos una sola vez por computadora.
Para correr el código se tienen que parar en la línea de código que
quieren usar y apretar las teclas Ctrl + Enter
o bien el triángulo verde (como si fuera un ícono de “Play”
▶️)
# Instalar los paquetes readxl y tidyverse
install.packages("tidyverse")
install.packages("readxl")Esto lo que hace es instalar paquetes desde CRAN, que es un repositorio donde se publican los paquetes, asegurando un estándar de calidad y de documentación que hace que trabajar con cualquier paquete de CRAN sea seguro.
Para usar las funciones de los paquetes que instalamos, ahora tenemos que cargarlos. Esto lo que hace es de alguna manera “activar” el paquete y que podamos empezar sus funciones.
Para cargar un paquete tenemos que usar la función
library(). Recuerden prestar atención a las mayúsculas y
minúsculas. Ahora no son necesarias las comillas.
# Cargar los paquetes readxl y tidyverse
library(readxl)
library(tidyverse)Una de las formas en las que nos damos cuenta que el paquete está instalado es cuando empezamos a escribir su nombre y nos aparece el nombre del paquete para autocompletar. Esta es una de las ventajas de trabajar en RStudio.
Recuerden:
La instalación de los paquetes se hace una sola vez por computadora.
La carga de los paquete se se hace cada vez que se abre un script.
Para este curso desarrollamos un paquete, introR4hr que
consiste en una serie de tutoriales interactivos que iremos compartiendo
a lo largo del curso.
introR4hr no es un paquete publicado en CRAN por lo cual hay que
descargar la versión de desarrollo desde el repositorio de GitHub y
seguir los siguientes pasos:
# Instalar los paquetes remotes y learnr
install.packages("remotes")
install.packages("learnr")
# Instalar el paquete introR4hr desde GitHub
remotes::install_github("chechoid/introR4hr")La notación remotes::install_github() reemplaza
parcialmente a la función library() ya que no carga el
paquete (ahorrando memoria) y sólo utiliza la función que está
invocando.
Por eso luego usamos la siguiente sintaxis para cargar un tutorial interactivo.
learnr::run_tutorial("sesion0", "introR4hr")Donde:
sesion0 es el nombre del tutorialintroR4hr es el nombre del paqueteComo gran parte de los datos que vamos a usar en la vida son archivos
de Excel vamos a usar la función read_excel() del paquete
readxls para levantar dos archivos: el archivo
maestro.xlsx que contiene un listado de empleados de una
empresa, y el archivo salarios.xlsx que contiene el sueldo
base de algunos de los empleados del listado.
# Cargar el archivo maestro.xlsx
maestro <- read_excel("maestro.xlsx")
# Cargar el archivo salarios.xlsx
salarios <- read_excel("salarios.xlsx")Los archivos no necesariamente tienen que estar en una computadora. También se pueden cargar archivos desde internet, por ejemplo, desde repositorios de GitHub:
# Cargar un archivo desde GitHub
encuesta <- read.csv("https://raw.githubusercontent.com/r4hr/kiwi2020/main/rh_ar.csv",
sep = ";",
encoding = "UTF-8")Otra alternativa para leer archivos .csv cuando el
delimitador entre campos no es una coma (,) es usar la
función read_delim() del paquete readr que
viene en tidyverse.
encuesta <- read_delim("https://raw.githubusercontent.com/r4hr/kiwi2020/main/rh_ar.csv",
delim = ";") # Indicamos el delimitador de camposUna función que nos permite ver el contenido de estos data
frames es la función View().
# Ver el contenido de los data frames maestro, salarios y encuesta
View(maestro)
View(salarios)
View(encuesta)Otra función interesante para explorar el contenido de un data frame
es la función glimpse() del paquete dplyr que
forma parte del paquete tidyverse.
# Explorar los dataframes maestro, salarios y encuesta
glimpse(maestro)## Rows: 522
## Columns: 8
## $ ID <dbl> 180, 242, 260, 277, 278, 304, 314, 315, 345, 362, 375, 38…
## $ ANTIGUEDAD <dbl> 38, 37, 36, 36, 36, 35, 35, 35, 40, 33, 32, 32, 32, 32, 3…
## $ EDAD <dbl> 63, 64, 61, 64, 59, 57, 54, 56, 59, 59, 55, 62, 52, 52, 6…
## $ ESTADO_CIVIL <chr> "C", "C", "C", "S", "C", "K", "C", "K", "C", "S", "S", "S…
## $ HIJOS <dbl> 1, 2, 2, 4, 0, 1, 4, 3, 2, 1, 5, 0, 4, 2, 3, 2, 2, 0, 4, …
## $ AREA <chr> "PRODUCCION 1", "PRODUCCION 1", "PRODUCCION 1", "PRODUCCI…
## $ ID_CAT <chr> "5", "5", "5", "5", "4", "4", "4", "4", "5", "4", "5", "5…
## $ N_CATEG <chr> "OP. CAT. 5", "OP. CAT. 5", "OP. CAT. 5", "OP. CAT. 5", "…
glimpse(salarios)## Rows: 135
## Columns: 3
## $ ID <dbl> 597, 789, 791, 804, 816, 820, 851, 864, 867, 872, 892, 898, 918…
## $ PUESTO <chr> "TEC. MANTENIMIENTO", "VOLANTE", "JEFE", "LIDER DE EQUIPO", "LI…
## $ SUELDO <dbl> 25129, 24474, 44344, 34235, 26401, 26682, 23851, 25811, 25877, …
str(encuesta)## spec_tbl_df [528 × 45] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Marca.temporal : POSIXct[1:528], format: "2020-09-30 20:29:06" "2020-09-30 21:45:26" ...
## $ genero : chr [1:528] "Femenino" "Masculino" "Femenino" "Femenino" ...
## $ genero_diverso : chr [1:528] "No" "Si" "No" "Si" ...
## $ edad : num [1:528] 35 33 24 32 32 26 29 30 34 41 ...
## $ discapacidad : chr [1:528] "No tengo ninguna discapacidad" "No tengo ninguna discapacidad" "No tengo ninguna discapacidad" "No tengo ninguna discapacidad" ...
## $ nivel_formacion : chr [1:528] "Universitario completo" "Universitario en curso" "Universitario en curso" "Secundario completo" ...
## $ carrera_grado : chr [1:528] "RRHH / RRLL / RRTT" "RRHH / RRLL / RRTT" "RRHH / RRLL / RRTT" "Contador Público/Lic. En Letras" ...
## $ tipo_universidad : chr [1:528] "Universidad Privada" "Universidad Pública" "Universidad Privada" "Universidad Pública" ...
## $ pais : chr [1:528] "Argentina" "Argentina" "Argentina" "Argentina" ...
## $ provincia : chr [1:528] "Buenos Aires" "Chaco" "Buenos Aires" "Buenos Aires" ...
## $ trabajo : chr [1:528] "Relación de Dependencia" "Relación de Dependencia" "Relación de Dependencia" "Relación de Dependencia" ...
## $ rubro : chr [1:528] "Comercio" "Otros" "Tecnología" "Hotelería, restauración, turismo" ...
## $ dotacion : num [1:528] 1433 6000 270 700 7500 ...
## $ origen_capital : chr [1:528] "Nacional" "Multinacional" "Nacional" "Nacional" ...
## $ dotacion_rh : num [1:528] 10 55 7 4 25 3 9 2 10 1 ...
## $ puesto : chr [1:528] "Analista" "HRBP" "Analista" "Gerente" ...
## $ tipo_contratacion : chr [1:528] "Full time" "Full time" "Full time" "Full time" ...
## $ funcion_rh : chr [1:528] "Administración de personal" "Relaciones laborales" "Reclutamiento y selección" "Generalista" ...
## $ personas_a_cargo : num [1:528] 0 8 0 3 0 0 2 1 0 0 ...
## $ anios_en_empresa : num [1:528] 0 9 1 10 2 3 5 7 2 0 ...
## $ anios_en_puesto : num [1:528] 0 3 1 3 2 3 3 4 2 0 ...
## $ anios_experiencia : num [1:528] 7 8 2 10 14 5 5 4 12 10 ...
## $ sueldo_bruto : num [1:528] 55700 55000 47000 86747 85500 ...
## $ beneficios : chr [1:528] "Tarjeta de descuento" "Medicina prepaga / Plan de salud, Horarios flexibles, Abono de celular, Seguro de vida (adicionales a los de le"| __truncated__ "Medicina prepaga / Plan de salud, Seguro de vida (adicionales a los de ley), Idiomas" "Horarios flexibles, Frutas y snacks, Abono de celular, Reintegros en capacitación, Home office, Comedor / Almue"| __truncated__ ...
## $ bono : chr [1:528] "Menos de un sueldo" "No recibo bono" "No recibo bono" "No recibo bono" ...
## $ ajuste : chr [1:528] "1 solo" "2 ajustes" "1 solo" "1 solo" ...
## $ ajuste_porcentaje : num [1:528] 20 50 25 50 10 15 17 25 30 0 ...
## $ ajuste_mes : chr [1:528] "Marzo" "Septiembre" "Septiembre" "Enero" ...
## $ otros_proyectos : chr [1:528] "No" "No" "No" "Si, en emprendimiento relacionado con RRHH" ...
## $ erp : chr [1:528] "Enlatado propio" "SAP / SuccessFactors" "No tenemos sistema de gestión" "Tango" ...
## $ nombre_area : chr [1:528] "Recursos Humanos" "Recursos Humanos" "Recursos Humanos" "Recursos Humanos" ...
## $ mate : chr [1:528] "Si, está permitido" "Si, está permitido" "Si, está permitido" "Si, está permitido" ...
## $ idioma_exigencia : chr [1:528] "No" "No" "No" "No" ...
## $ idioma_porcentaje : num [1:528] 0 0 0.2 0 0.2 0 0.1 NA 0 0 ...
## $ contactos_linkedin : num [1:528] 500 100 3000 1474 9240 ...
## $ satisfaccion : num [1:528] 3 5 3 5 2 3 4 NA 2 5 ...
## $ busqueda : chr [1:528] "No, pero escucho ofertas" "No, pero escucho ofertas" "No, pero escucho ofertas" "No estoy buscando cambiar" ...
## $ beneficios_expectativa : chr [1:528] "Vacaciones extendidas, almuerzo,medicina prepaga" "Bono semestral" "mas home, bonificaciones, comedor" "Idiomas" ...
## $ rh_una_palabra : chr [1:528] "Servicio" "Indispensable" "Empatia" "Valor" ...
## $ pregunta_bizarra : chr [1:528] "Si pensaba tener hijos en los próximos meses" "No recuerdo ninguna" "cual es tu signo?" NA ...
## $ teletrabajo : chr [1:528] "Voy rotando entre la oficina y el trabajo" "Si" "Voy rotando entre la oficina y el trabajo" "Voy rotando entre la oficina y el trabajo" ...
## $ elementos : chr [1:528] "Computadora / Laptop" "Computadora / Laptop, Silla ergonómica, Abono de celular, Abono de internet" "Computadora / Laptop" "Computadora / Laptop" ...
## $ valoracion_gestion_empresa: num [1:528] 3 5 3 3 2 4 4 NA NA NA ...
## $ multiplicador : num [1:528] 1 1 1 1 1 1 1 1 1 1 ...
## $ sueldo_ft : num [1:528] 55700 55000 47000 86747 85500 ...
## - attr(*, "spec")=
## .. cols(
## .. Marca.temporal = col_datetime(format = ""),
## .. genero = col_character(),
## .. genero_diverso = col_character(),
## .. edad = col_double(),
## .. discapacidad = col_character(),
## .. nivel_formacion = col_character(),
## .. carrera_grado = col_character(),
## .. tipo_universidad = col_character(),
## .. pais = col_character(),
## .. provincia = col_character(),
## .. trabajo = col_character(),
## .. rubro = col_character(),
## .. dotacion = col_double(),
## .. origen_capital = col_character(),
## .. dotacion_rh = col_double(),
## .. puesto = col_character(),
## .. tipo_contratacion = col_character(),
## .. funcion_rh = col_character(),
## .. personas_a_cargo = col_double(),
## .. anios_en_empresa = col_double(),
## .. anios_en_puesto = col_double(),
## .. anios_experiencia = col_double(),
## .. sueldo_bruto = col_double(),
## .. beneficios = col_character(),
## .. bono = col_character(),
## .. ajuste = col_character(),
## .. ajuste_porcentaje = col_double(),
## .. ajuste_mes = col_character(),
## .. otros_proyectos = col_character(),
## .. erp = col_character(),
## .. nombre_area = col_character(),
## .. mate = col_character(),
## .. idioma_exigencia = col_character(),
## .. idioma_porcentaje = col_double(),
## .. contactos_linkedin = col_double(),
## .. satisfaccion = col_double(),
## .. busqueda = col_character(),
## .. beneficios_expectativa = col_character(),
## .. rh_una_palabra = col_character(),
## .. pregunta_bizarra = col_character(),
## .. teletrabajo = col_character(),
## .. elementos = col_character(),
## .. valoracion_gestion_empresa = col_double(),
## .. multiplicador = col_double(),
## .. sueldo_ft = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
Esto que estamos haciendo se llama Análisis Exploratorio de Datos, pueden ver la sesión que hicimos en R4HR Club de R para RRHH en YouTube.
RStudio además de desarrollar la IDE para usar R, es también uno de los principales desarrolladores de paquetes.
Uno de sus paquetes, que engloba varios paquetes, se convirtió en un estándar de la limpieza y transformación de datos, que es tidyverse. A este estándar de limpieza de datos se lo llama tidy data, en donde entre sus principios dice:
Cada variable forma una columna.
Cada observación tiene que estar en una fila.
Como decíamos, tidyverse es un paquete que engloba
varios paquetes, todos muy utilizados, a veces declarativamente, otras
veces R lo usa detrás de escenas. En esta sesión vamos a usar
principalmente los paquetes dplyr.
Una de las razones por las cuales tidyverse se hizo tan popular es que la lógica de las funciones imita el razonamiento que haríamos verbalmente.
Por ejemplo, ¿cómo harían para calcular la edad promedio por área?
maestro %>%
select(AREA, EDAD) %>% # Selecciona las columnas
group_by(AREA) %>% # Agrupa por la variable AREA
summarise(edad_promedio = mean(EDAD)) %>% # Crea una variable con la edad promedio
arrange(-edad_promedio) # Ordena descendentemente los resultados por la variable que pasemos.## # A tibble: 12 × 2
## AREA edad_promedio
## <chr> <dbl>
## 1 COMPRAS 47.3
## 2 GERENCIA GENERAL 45.5
## 3 ALMACEN 42.4
## 4 DESARROLLO 40.5
## 5 PRODUCCION 1 38.4
## 6 LOGISTICA 36.7
## 7 PRODUCCION 2 36.0
## 8 CALIDAD 35.6
## 9 RRHH 35.4
## 10 MASS 30
## 11 COMERCIAL 29.8
## 12 FINANZAS 29.5
¿Vieron este símbolo %>% en la slide anterior? En la
jerga lo conocemos como “pipe” (atajo de teclado
Ctrl + Mayús + M). Lo que nos
permite este “tubo” es ordenar el código en secuencias,
haciéndolo más comprensible a la lectura.
Una de las ventajas del pipe es que no necesitamos invocar al dataframe en cada función que encadenamos en el pipe.
Por ejemplo, queremos ver los empledos que tienen hijos por cada área. Los pasos son:
# Versión sin pipe
arrange(filter(select(maestro, AREA,ID, HIJOS), HIJOS > 0), AREA)## # A tibble: 377 × 3
## AREA ID HIJOS
## <chr> <dbl> <dbl>
## 1 ALMACEN 653 2
## 2 ALMACEN 741 4
## 3 ALMACEN 980 2
## 4 ALMACEN 1085 2
## 5 ALMACEN 1138 4
## 6 ALMACEN 1436 1
## 7 ALMACEN 3117 2
## 8 CALIDAD 404 2
## 9 CALIDAD 596 3
## 10 CALIDAD 789 2
## # … with 367 more rows
Esto mismo usando el pipe de dplyr lo hacemos así:
maestro %>%
select(AREA, ID, HIJOS) %>%
filter(HIJOS>0) %>%
arrange(AREA) ## # A tibble: 377 × 3
## AREA ID HIJOS
## <chr> <dbl> <dbl>
## 1 ALMACEN 653 2
## 2 ALMACEN 741 4
## 3 ALMACEN 980 2
## 4 ALMACEN 1085 2
## 5 ALMACEN 1138 4
## 6 ALMACEN 1436 1
## 7 ALMACEN 3117 2
## 8 CALIDAD 404 2
## 9 CALIDAD 596 3
## 10 CALIDAD 789 2
## # … with 367 more rows
Habitualmente a las funciones del paquete dplyr las llamamos verbos. Para muchos paquetes desarrollados por RStudio existe un cheat sheet o guía de referencia para ayudarnos a recordar las funciones más utilizadas y se encuentran en este link de su página.
En la sección Translations podemos encontrar muchos cheat sheets en español. Acá pueden descargar el de transformación de datos que veremos hoy.
La función left_join() es un equivalente a la función de
Excel BUSCARV o VLOOKUP. Esto nos permite trabajar con
múltiples archivos sin necesidad de pasarlos manualmente uno por uno a
un archivo que contenga a todos, sino traer la información que
necesitemos.
Hay muchos tipos de join() distintos, por ejemplo
right_join(), inner_join(), o
anti_join() por ejemplo que no serán tema de este
curso.
Vamos a crear un data frame combinando las tablas
maestro y salarios.
# Hacer un left_join de maestro y salarios y guardarlo en un data frame llamado maestro_full
maestro_full <- left_join(maestro, salarios, by = "ID")
# Usar la función glimpse() en el nuevo data frame
glimpse(maestro_full)## Rows: 522
## Columns: 10
## $ ID <dbl> 180, 242, 260, 277, 278, 304, 314, 315, 345, 362, 375, 38…
## $ ANTIGUEDAD <dbl> 38, 37, 36, 36, 36, 35, 35, 35, 40, 33, 32, 32, 32, 32, 3…
## $ EDAD <dbl> 63, 64, 61, 64, 59, 57, 54, 56, 59, 59, 55, 62, 52, 52, 6…
## $ ESTADO_CIVIL <chr> "C", "C", "C", "S", "C", "K", "C", "K", "C", "S", "S", "S…
## $ HIJOS <dbl> 1, 2, 2, 4, 0, 1, 4, 3, 2, 1, 5, 0, 4, 2, 3, 2, 2, 0, 4, …
## $ AREA <chr> "PRODUCCION 1", "PRODUCCION 1", "PRODUCCION 1", "PRODUCCI…
## $ ID_CAT <chr> "5", "5", "5", "5", "4", "4", "4", "4", "5", "4", "5", "5…
## $ N_CATEG <chr> "OP. CAT. 5", "OP. CAT. 5", "OP. CAT. 5", "OP. CAT. 5", "…
## $ PUESTO <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ SUELDO <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
Ahora contamos con los datos del listado de personal y también de los salarios de un segmento de la gente de la compañía. Con lo cual podremos hacer un análisis de los salarios de la organización.
Con la función select() lo que hacemos es elegir con qué
columnas (variables queremos trabajar). Por ejemplo, elijamos del data
frame encuesta las variables genero,
puesto, tipo_universidad y
sueldo_bruto.
# Seleccionar del data frame encuesta las variables genero y sueldo_bruto
encuesta %>% # el atajo del pipe es Ctrl + Mayús + M
select(genero, puesto, tipo_universidad, sueldo_bruto)## # A tibble: 528 × 4
## genero puesto tipo_universidad sueldo_bruto
## <chr> <chr> <chr> <dbl>
## 1 Femenino Analista Universidad Privada 55700
## 2 Masculino HRBP Universidad Pública 55000
## 3 Femenino Analista Universidad Privada 47000
## 4 Femenino Gerente Universidad Pública 86747
## 5 Masculino HRBP Universidad Privada 85500
## 6 Femenino Analista Universidad Pública 73600
## 7 Masculino HRBP Universidad Pública 80000
## 8 Femenino Responsable Universidad Pública 98948
## 9 Femenino HRBP Universidad Privada 85000
## 10 Masculino Analista No estudié en la Universidad 60241
## # … with 518 more rows
select() nos permite también elegir el orden en que
queremos las columnas.
# Seleccionar las mismas variables en orden diferente
encuesta %>%
select(tipo_universidad, sueldo_bruto, puesto, genero)## # A tibble: 528 × 4
## tipo_universidad sueldo_bruto puesto genero
## <chr> <dbl> <chr> <chr>
## 1 Universidad Privada 55700 Analista Femenino
## 2 Universidad Pública 55000 HRBP Masculino
## 3 Universidad Privada 47000 Analista Femenino
## 4 Universidad Pública 86747 Gerente Femenino
## 5 Universidad Privada 85500 HRBP Masculino
## 6 Universidad Pública 73600 Analista Femenino
## 7 Universidad Pública 80000 HRBP Masculino
## 8 Universidad Pública 98948 Responsable Femenino
## 9 Universidad Privada 85000 HRBP Femenino
## 10 No estudié en la Universidad 60241 Analista Masculino
## # … with 518 more rows
Podemos crear nuevos data frames con la selección de columnas que necesitemos. Esto es muy útil cuando estamos trabajando con muchos datos porque permite que la computadora sea más eficiente.
# Crear un nuevo data frame con las columnas seleccionadas
encuesta_chica <- encuesta %>% # Asigno al nuevo data frame del data frame original
select(genero, puesto, sueldo_bruto, tipo_universidad) # Selecciono las columnas que quieraCon el signo menos (-) le podemos indicar a R las
columnas que no necesitamos.
encuesta_chica %>%
select(-tipo_universidad)## # A tibble: 528 × 3
## genero puesto sueldo_bruto
## <chr> <chr> <dbl>
## 1 Femenino Analista 55700
## 2 Masculino HRBP 55000
## 3 Femenino Analista 47000
## 4 Femenino Gerente 86747
## 5 Masculino HRBP 85500
## 6 Femenino Analista 73600
## 7 Masculino HRBP 80000
## 8 Femenino Responsable 98948
## 9 Femenino HRBP 85000
## 10 Masculino Analista 60241
## # … with 518 more rows
Para saber más sobre esta función recomendamos leer la página del paquete.
Para realizar un análisis salarial hay columnas que no son
interesantes para el análisis. Seleccionar las columnas ID,
ANTIGUEDAD, EDAD, AREA,
PUESTO y SUELDO.
# Seleccionar las columnas ID, ANTIGUEDAD, EDAD, AREA, PUESTO y SUELDO
# Llamar al nuevo data frame maestro2
maestro2 <- maestro_full %>%
select(ID, ANTIGUEDAD, EDAD, AREA, PUESTO, SUELDO)Así como select() trabaja sobre las columnas, la función
filter() lo hace sobre las filas. filter() nos
permite seleccionar las observaciones que cumplan con los criterios que
nos interesan.
Para esto, vamos a necesitar la ayuda de los operadores lógicos.
| Símbolo | Operador |
|---|---|
== |
Igual a |
!= |
Distinto a |
< |
Menor que |
<= |
Menor o igual que |
> |
Mayor que |
>= |
Mayor o igual que |
& |
Y (AND) |
| |
O (OR) |
Para hacer los ejemplos más legibles vamos a crear una nueva versión
de la encuesta seleccionando las variables genero,
sueldo_bruto, provincia,
anios_experiencia, edad y puesto.
Esto lo vamos a almacenar en un nuevo data frame llamado
encuesta2.
# Creamos el data frame encuesta2 con las variables genero, sueldo_bruto, provincia, anios_experiencia, edad y puesto
encuesta2 <- encuesta %>%
select(genero, sueldo_bruto, provincia, anios_experiencia, edad, puesto)Por ejemplo, si quiero ver las respuestas de las personas de la
provincia de San Juan tenemos que hacer lo siguiente:
# Seleccionar respuestas de San Juan
encuesta2 %>%
filter(provincia == "San Juan")## # A tibble: 37 × 6
## genero sueldo_bruto provincia anios_experiencia edad puesto
## <chr> <dbl> <chr> <dbl> <dbl> <chr>
## 1 Masculino 190000 San Juan 7 33 Jefe
## 2 Femenino 70800 San Juan 8 35 Jefe
## 3 Femenino 41000 San Juan 8 31 Administrativo
## 4 Femenino 30000 San Juan 14 39 Responsable
## 5 Femenino 68000 San Juan 12 36 Jefe
## 6 Femenino 40000 San Juan 9 28 Administrativo
## 7 Masculino 110000 San Juan 9 36 Analista
## 8 Femenino 62000 San Juan 2 23 Responsable
## 9 Masculino 73000 San Juan 12 34 Responsable
## 10 Femenino 80000 San Juan 4 26 Gerente
## # … with 27 more rows
Si yo quiero filtrar por ejemplo, las respuestas de
Buenos Aires y cuya edad sea menor o igual a
30, podemos hacer lo siguiente:
# Seleccionar respuestas de Buenos Aires y que sean hasta 30 años
encuesta2 %>%
filter(provincia == "Buenos Aires" &
edad <= 30)## # A tibble: 34 × 6
## genero sueldo_bruto provincia anios_experiencia edad puesto
## <chr> <dbl> <chr> <dbl> <dbl> <chr>
## 1 Femenino 47000 Buenos Aires 2 24 Analista
## 2 Femenino 62000 Buenos Aires 8 29 Responsable
## 3 Femenino 69500 Buenos Aires 5 30 Responsable
## 4 Masculino 116000 Buenos Aires 10 29 Responsable
## 5 Femenino 78000 Buenos Aires 5 30 Analista
## 6 Femenino 90000 Buenos Aires 9 30 Analista
## 7 Femenino 45000 Buenos Aires 3 22 Jefe
## 8 Masculino 70000 Buenos Aires 5 27 Analista
## 9 Femenino 65000 Buenos Aires 5 27 Analista
## 10 Femenino 60000 Buenos Aires 2 27 Analista
## # … with 24 more rows
# Reemplazar el símbolo & por una coma (,)
encuesta2 %>%
filter(provincia == "Buenos Aires",
edad <= 30)## # A tibble: 34 × 6
## genero sueldo_bruto provincia anios_experiencia edad puesto
## <chr> <dbl> <chr> <dbl> <dbl> <chr>
## 1 Femenino 47000 Buenos Aires 2 24 Analista
## 2 Femenino 62000 Buenos Aires 8 29 Responsable
## 3 Femenino 69500 Buenos Aires 5 30 Responsable
## 4 Masculino 116000 Buenos Aires 10 29 Responsable
## 5 Femenino 78000 Buenos Aires 5 30 Analista
## 6 Femenino 90000 Buenos Aires 9 30 Analista
## 7 Femenino 45000 Buenos Aires 3 22 Jefe
## 8 Masculino 70000 Buenos Aires 5 27 Analista
## 9 Femenino 65000 Buenos Aires 5 27 Analista
## 10 Femenino 60000 Buenos Aires 2 27 Analista
## # … with 24 more rows
Si prestamos atención, cuando filtramos por algún valor que contenga texto necesitamos usar las comillas, mientras que para las variables numéricas esto no es necesario.
Si queremos filtrar varios valores de una misma columna lo ideal es trabajar con un vector.
# Selección poco eficiente
encuesta2 %>%
filter(provincia == "Buenos Aires" | provincia == "Santa Fe" | provincia == "Corrientes" |
provincia == "Córdoba" | provincia == "San Juan")## # A tibble: 222 × 6
## genero sueldo_bruto provincia anios_experiencia edad puesto
## <chr> <dbl> <chr> <dbl> <dbl> <chr>
## 1 Femenino 55700 Buenos Aires 7 35 Analista
## 2 Femenino 47000 Buenos Aires 2 24 Analista
## 3 Femenino 86747 Buenos Aires 10 32 Gerente
## 4 Masculino 85500 Buenos Aires 14 32 HRBP
## 5 Masculino 65662 Buenos Aires 9 33 HRBP
## 6 Masculino 190000 San Juan 7 33 Jefe
## 7 Femenino 70800 San Juan 8 35 Jefe
## 8 Femenino 41000 San Juan 8 31 Administrativo
## 9 Femenino 30000 San Juan 14 39 Responsable
## 10 Femenino 40000 Santa Fe 20 38 Responsable
## # … with 212 more rows
# Selección más eficiente con el operador %in%
encuesta2 %>%
filter(provincia %in% c("Buenos Aires", "Santa Fe", "Corrientes", "Córdoba", "San Juan"))## # A tibble: 222 × 6
## genero sueldo_bruto provincia anios_experiencia edad puesto
## <chr> <dbl> <chr> <dbl> <dbl> <chr>
## 1 Femenino 55700 Buenos Aires 7 35 Analista
## 2 Femenino 47000 Buenos Aires 2 24 Analista
## 3 Femenino 86747 Buenos Aires 10 32 Gerente
## 4 Masculino 85500 Buenos Aires 14 32 HRBP
## 5 Masculino 65662 Buenos Aires 9 33 HRBP
## 6 Masculino 190000 San Juan 7 33 Jefe
## 7 Femenino 70800 San Juan 8 35 Jefe
## 8 Femenino 41000 San Juan 8 31 Administrativo
## 9 Femenino 30000 San Juan 14 39 Responsable
## 10 Femenino 40000 Santa Fe 20 38 Responsable
## # … with 212 more rows
Hay funciones auxiliares de filter que nos permiten hacer cosas
interesantes. Una de ellas es between() que permite hacer
selecciones entre un rango de valores:
# Filtrar los sueldos brutos entre 50.000 y 100.000
encuesta2 %>%
filter(between(sueldo_bruto, # Nombre de la variable
50000, # Valor mínimo del filtro
100000)) # Valor máximo del filtro## # A tibble: 315 × 6
## genero sueldo_bruto provincia anios_e…¹ edad puesto
## <chr> <dbl> <chr> <dbl> <dbl> <chr>
## 1 Femenino 55700 Buenos Aires 7 35 Anali…
## 2 Masculino 55000 Chaco 8 33 HRBP
## 3 Femenino 86747 Buenos Aires 10 32 Geren…
## 4 Masculino 85500 Buenos Aires 14 32 HRBP
## 5 Femenino 73600 Ciudad Autónoma de Buenos Aires 5 26 Anali…
## 6 Masculino 80000 Ciudad Autónoma de Buenos Aires 5 29 HRBP
## 7 Femenino 98948 Ciudad Autónoma de Buenos Aires 4 30 Respo…
## 8 Femenino 85000 Jujuy 12 34 HRBP
## 9 Masculino 60241 Tucumán 10 41 Anali…
## 10 Masculino 65662 Buenos Aires 9 33 HRBP
## # … with 305 more rows, and abbreviated variable name ¹anios_experiencia
Filtrar de encuesta2 las respuestas cuyo
puesto sea Analista y HRBP.
# Filtrar las respuestas cuyo puesto sea Analista o HRBP
encuesta2 %>%
filter(puesto %in% c("Analista", "HRBP"))## # A tibble: 265 × 6
## genero sueldo_bruto provincia anios_e…¹ edad puesto
## <chr> <dbl> <chr> <dbl> <dbl> <chr>
## 1 Femenino 55700 Buenos Aires 7 35 Anali…
## 2 Masculino 55000 Chaco 8 33 HRBP
## 3 Femenino 47000 Buenos Aires 2 24 Anali…
## 4 Masculino 85500 Buenos Aires 14 32 HRBP
## 5 Femenino 73600 Ciudad Autónoma de Buenos Aires 5 26 Anali…
## 6 Masculino 80000 Ciudad Autónoma de Buenos Aires 5 29 HRBP
## 7 Femenino 85000 Jujuy 12 34 HRBP
## 8 Masculino 60241 Tucumán 10 41 Anali…
## 9 Masculino 65662 Buenos Aires 9 33 HRBP
## 10 Masculino 70000 Ciudad Autónoma de Buenos Aires 5 31 Anali…
## # … with 255 more rows, and abbreviated variable name ¹anios_experiencia
Crear un nuevo data frame, llamado mensuales que
contenga todo lo que no sea NA de la columna
PUESTO del data frame maestro2. Usar
!is.na() dentro de filter().
# Crear un nuevo data frame llamado mensuales de maestro2
# Filtrar todo lo que NO SEA nulo (NA) de la columna PUESTO
mensuales <- maestro_full %>%
filter(!is.na(PUESTO))
# Ver los resultados con glimpse()
glimpse(mensuales)## Rows: 135
## Columns: 10
## $ ID <dbl> 597, 789, 791, 804, 816, 820, 851, 864, 867, 872, 892, 89…
## $ ANTIGUEDAD <dbl> 23, 12, 12, 11, 10, 10, 9, 9, 9, 9, 8, 8, 8, 7, 7, 7, 7, …
## $ EDAD <dbl> 55, 48, 34, 33, 40, 37, 41, 33, 28, 43, 41, 30, 30, 42, 3…
## $ ESTADO_CIVIL <chr> "C", "C", "C", "C", "C", "K", "C", "C", "S", "K", "C", "C…
## $ HIJOS <dbl> 5, 2, 0, 3, 3, 2, 1, 2, 0, 1, 1, 1, 2, 3, 2, 4, 2, 0, 2, …
## $ AREA <chr> "PRODUCCION 1", "CALIDAD", "PRODUCCION 1", "PRODUCCION 1"…
## $ ID_CAT <chr> "G", "F", "F", "F", "F", "E", "F", "F", "G", "F", "F", "F…
## $ N_CATEG <chr> "Cat : G", "Cat : F", "LIDER DE EQUIPO", "LIDER DE EQUIPO…
## $ PUESTO <chr> "TEC. MANTENIMIENTO", "VOLANTE", "JEFE", "LIDER DE EQUIPO…
## $ SUELDO <dbl> 25129, 24474, 44344, 34235, 26401, 26682, 23851, 25811, 2…
group_by() es una función que se usa mucho en conjunto
con summarise(). Por ejemplo cuando decimos:
Quiero saber la edad promedio por categoría, agrupamos por categoría y calculando por edad.
Quiero saber la mediana salarial por género estamos agrupando por género y calculando por sueldo.
Quiero saber la antigüedad máxima por sector estamos agrupando por sector y calculando por antiguedad.
Con group_by() lo que hacemos es agrupar todas las filas
de un data frame y reducirlas a una cantidad más chica de filas. La
cantidad de filas va a estar determinada por los distintos valores que
haya en una columna.
Por otro lado summarise() lo que hace es añadir una
columna nueva a ese data frame agrupado con algún cálculo que nos
interese realizar.
Usemos el data frame encuesta2 para ver algunos
ejemplos. Primero, calculemos los años de experiencia promedio por
puesto.
unique(encuesta2$puesto)## [1] "Analista" "HRBP" "Gerente" "Responsable"
## [5] "Jefe" "Administrativo"
# Agrupar por puesto y calcular el promedio de anios_experiencia
encuesta2 %>%
group_by(puesto) %>%
summarise(antiguedad_promedio = mean(anios_experiencia))## # A tibble: 6 × 2
## puesto antiguedad_promedio
## <chr> <dbl>
## 1 Administrativo 4.03
## 2 Analista 6.52
## 3 Gerente 13.3
## 4 HRBP 7.5
## 5 Jefe 12.9
## 6 Responsable 8.42
También podemos agrupar por más de una variable. También podemos
hacer más de un cálculo a la vez. Calculemos la mediana y el promedio de
los sueldos por puesto y por genero.
# Agrupar por puesto y genero y calcular la mediana y el promedio
encuesta2 %>%
group_by(puesto, genero) %>%
summarise(mediana_salarial = median(sueldo_bruto),
promedio_salarial = mean(sueldo_bruto))## # A tibble: 12 × 4
## # Groups: puesto [6]
## puesto genero mediana_salarial promedio_salarial
## <chr> <chr> <dbl> <dbl>
## 1 Administrativo Femenino 44840 48107.
## 2 Administrativo Masculino 48200 53736.
## 3 Analista Femenino 60000 62586.
## 4 Analista Masculino 70000 75153.
## 5 Gerente Femenino 147500 135608.
## 6 Gerente Masculino 147000 156023.
## 7 HRBP Femenino 85200 93234.
## 8 HRBP Masculino 84500 95882.
## 9 Jefe Femenino 102500 104159.
## 10 Jefe Masculino 104500 119824.
## 11 Responsable Femenino 70000 73944.
## 12 Responsable Masculino 80000 89864.
En R siempre hay más de una forma de llegar al mismo resultado. Por
ejemplo. Si queremos contar la cantidad de respuestas por
tipo_universidad podemos:
# Agrupar por tipo_universidad + summarise() + n()
encuesta %>%
group_by(tipo_universidad) %>%
summarise(cantidad = n())## # A tibble: 3 × 2
## tipo_universidad cantidad
## <chr> <int>
## 1 No estudié en la Universidad 22
## 2 Universidad Privada 238
## 3 Universidad Pública 268
# Agrupar por tipo_universidad + tally()
encuesta %>%
group_by(tipo_universidad) %>%
tally()## # A tibble: 3 × 2
## tipo_universidad n
## <chr> <int>
## 1 No estudié en la Universidad 22
## 2 Universidad Privada 238
## 3 Universidad Pública 268
# Contar por tipo de universidad count()
encuesta %>%
count(tipo_universidad)## # A tibble: 3 × 2
## tipo_universidad n
## <chr> <int>
## 1 No estudié en la Universidad 22
## 2 Universidad Privada 238
## 3 Universidad Pública 268
Del data frame mensuales calcular el promedio salarial
por puesto. No hace falta guardar los resultados en un objeto.
# Calcular el sueldo promedio por puesto
mensuales %>%
group_by(PUESTO) %>%
summarise(sueldo_promedio = mean(SUELDO))## # A tibble: 10 × 2
## PUESTO sueldo_promedio
## <chr> <dbl>
## 1 ANALISTA 22971.
## 2 ENCARGADO 26738
## 3 GERENTE 75098.
## 4 GERENTE GENERAL 94128
## 5 INGENIERO 31240.
## 6 JEFE 44547
## 7 LIDER DE EQUIPO 31434.
## 8 TEC. DESARROLLO 26755.
## 9 TEC. MANTENIMIENTO 28940.
## 10 VOLANTE 24422.
Calcular la antigüedad promedio por área.
# Calcular la antigüedad promedio por área
mensuales %>%
group_by(AREA) %>%
summarise(edad_promedio = mean(EDAD))## # A tibble: 12 × 2
## AREA edad_promedio
## <chr> <dbl>
## 1 ALMACEN 45.8
## 2 CALIDAD 36.8
## 3 COMERCIAL 29.8
## 4 COMPRAS 47.3
## 5 DESARROLLO 40.5
## 6 FINANZAS 29.5
## 7 GERENCIA GENERAL 45.5
## 8 LOGISTICA 37.6
## 9 MASS 30
## 10 PRODUCCION 1 40.5
## 11 PRODUCCION 2 35.6
## 12 RRHH 35.4
Calcular el sueldo máximo y el mínimo por puesto.
mensuales %>%
group_by(PUESTO) %>%
summarise(sueldo_minimo = min(SUELDO),
sueldo_maximo = max(SUELDO))## # A tibble: 10 × 3
## PUESTO sueldo_minimo sueldo_maximo
## <chr> <dbl> <dbl>
## 1 ANALISTA 14776 38010
## 2 ENCARGADO 25811 27665
## 3 GERENTE 64016 86366
## 4 GERENTE GENERAL 94128 94128
## 5 INGENIERO 22200 42824
## 6 JEFE 31879 61994
## 7 LIDER DE EQUIPO 22163 41410
## 8 TEC. DESARROLLO 18114 37618
## 9 TEC. MANTENIMIENTO 15975 40680
## 10 VOLANTE 22380 27124
mutate es una función que nos permite agregar nuevas
columnas al data frame en base a columnas existentes en nuestra
tabla.
Tomemos la tabla encuesta2 y agreguemos una columna
nueva con el sueldo en dólares. Para eso hay que dividir a la columna
sueldo_bruto por 100
# Agregar a encuesta2 la columna sueldo_dolar
encuesta2 <- encuesta2 %>%
mutate(sueldo_dolar = sueldo_bruto / 100)
# Ver el resultado
glimpse(encuesta2)## Rows: 528
## Columns: 7
## $ genero <chr> "Femenino", "Masculino", "Femenino", "Femenino", "Ma…
## $ sueldo_bruto <dbl> 55700, 55000, 47000, 86747, 85500, 73600, 80000, 989…
## $ provincia <chr> "Buenos Aires", "Chaco", "Buenos Aires", "Buenos Air…
## $ anios_experiencia <dbl> 7, 8, 2, 10, 14, 5, 5, 4, 12, 10, 13, 9, 5, 10, 3, 3…
## $ edad <dbl> 35, 33, 24, 32, 32, 26, 29, 30, 34, 41, 37, 33, 31, …
## $ puesto <chr> "Analista", "HRBP", "Analista", "Gerente", "HRBP", "…
## $ sueldo_dolar <dbl> 557.00, 550.00, 470.00, 867.47, 855.00, 736.00, 800.…
También nos permite modificar las variables existentes. Por ejemplo, calculemos el sueldo promedio por puesto.
# Calculemos el sueldo promedio por puesto con group_by() y summarise()
encuesta2 %>%
group_by(puesto) %>%
summarise(sueldo_promedio = mean(sueldo_bruto))## # A tibble: 6 × 2
## puesto sueldo_promedio
## <chr> <dbl>
## 1 Administrativo 49144.
## 2 Analista 66040.
## 3 Gerente 144169.
## 4 HRBP 94411.
## 5 Jefe 109543.
## 6 Responsable 78475.
El resultado está ordenado alfabéticamente, lo cual no es ideal. Esto
ocurre porque la variable puesto es una variable maestrol
(tipo character). Para convertirla en una variable ordinal
necesitamos transformar la variable en una variable de tipo
factor.
# Sobrescribir la variable puesto como factor
encuesta2 <- encuesta2 %>%
mutate(puesto = factor(puesto,
levels = c("Gerente", "Jefe", "Responsable",
"HRBP", "Analista", "Administrativo")))
glimpse(encuesta2)## Rows: 528
## Columns: 7
## $ genero <chr> "Femenino", "Masculino", "Femenino", "Femenino", "Ma…
## $ sueldo_bruto <dbl> 55700, 55000, 47000, 86747, 85500, 73600, 80000, 989…
## $ provincia <chr> "Buenos Aires", "Chaco", "Buenos Aires", "Buenos Air…
## $ anios_experiencia <dbl> 7, 8, 2, 10, 14, 5, 5, 4, 12, 10, 13, 9, 5, 10, 3, 3…
## $ edad <dbl> 35, 33, 24, 32, 32, 26, 29, 30, 34, 41, 37, 33, 31, …
## $ puesto <fct> Analista, HRBP, Analista, Gerente, HRBP, Analista, H…
## $ sueldo_dolar <dbl> 557.00, 550.00, 470.00, 867.47, 855.00, 736.00, 800.…
Hay varias funciones auxiliares, una muy interesante para construir
categorías en función de una variable numérica es
case_when() que se usa dentro de mutate().
# Crear una variable nueva con rangos de edad y guardarlo en encuesta3
encuesta3 <- encuesta2 %>%
select(edad, sueldo_bruto) %>%
mutate(rango_edad = case_when(
edad <= 30 ~ "Hasta 30",
edad <= 40 ~ "Hasta 40",
edad = TRUE ~ "Más de 40"
))
# Calcular el sueldo promedio por rango de edad.
encuesta3 %>%
group_by(rango_edad) %>%
summarise(sueldo_promedio = mean(sueldo_bruto))## # A tibble: 3 × 2
## rango_edad sueldo_promedio
## <chr> <dbl>
## 1 Hasta 30 66364.
## 2 Hasta 40 87458.
## 3 Más de 40 98767.
En Argentina los impuestos que tienen que pagar las personas asalariadas son:
11% por Jubilación.
3% por Seguridad Social
3% por Obra Social (cobertura de salud).
Crear una columna nueva que se llame carga_social que
resulte de multiplicar la columna SUELDO por 0.17
# Calcular las cargas sociales de los sueldos
mensuales <- mensuales %>%
mutate(carga_social = SUELDO * 0.17)
# Ver los resultados con glimpse()
glimpse(mensuales)## Rows: 135
## Columns: 11
## $ ID <dbl> 597, 789, 791, 804, 816, 820, 851, 864, 867, 872, 892, 89…
## $ ANTIGUEDAD <dbl> 23, 12, 12, 11, 10, 10, 9, 9, 9, 9, 8, 8, 8, 7, 7, 7, 7, …
## $ EDAD <dbl> 55, 48, 34, 33, 40, 37, 41, 33, 28, 43, 41, 30, 30, 42, 3…
## $ ESTADO_CIVIL <chr> "C", "C", "C", "C", "C", "K", "C", "C", "S", "K", "C", "C…
## $ HIJOS <dbl> 5, 2, 0, 3, 3, 2, 1, 2, 0, 1, 1, 1, 2, 3, 2, 4, 2, 0, 2, …
## $ AREA <chr> "PRODUCCION 1", "CALIDAD", "PRODUCCION 1", "PRODUCCION 1"…
## $ ID_CAT <chr> "G", "F", "F", "F", "F", "E", "F", "F", "G", "F", "F", "F…
## $ N_CATEG <chr> "Cat : G", "Cat : F", "LIDER DE EQUIPO", "LIDER DE EQUIPO…
## $ PUESTO <chr> "TEC. MANTENIMIENTO", "VOLANTE", "JEFE", "LIDER DE EQUIPO…
## $ SUELDO <dbl> 25129, 24474, 44344, 34235, 26401, 26682, 23851, 25811, 2…
## $ carga_social <dbl> 4271.93, 4160.58, 7538.48, 5819.95, 4488.17, 4535.94, 405…
Crear una columna nueva que se llama costo_anual que sea
el resultado de multiplicar las columnas SUELDO más
carga_social por 13.
# Crear una columna que sume SUELDO + carga_social y lo multiplique por 13
mensuales <- mensuales %>%
mutate(costo_anual = (SUELDO + carga_social)*13)
# Ver los resultados con glimpse()
glimpse(mensuales)## Rows: 135
## Columns: 12
## $ ID <dbl> 597, 789, 791, 804, 816, 820, 851, 864, 867, 872, 892, 89…
## $ ANTIGUEDAD <dbl> 23, 12, 12, 11, 10, 10, 9, 9, 9, 9, 8, 8, 8, 7, 7, 7, 7, …
## $ EDAD <dbl> 55, 48, 34, 33, 40, 37, 41, 33, 28, 43, 41, 30, 30, 42, 3…
## $ ESTADO_CIVIL <chr> "C", "C", "C", "C", "C", "K", "C", "C", "S", "K", "C", "C…
## $ HIJOS <dbl> 5, 2, 0, 3, 3, 2, 1, 2, 0, 1, 1, 1, 2, 3, 2, 4, 2, 0, 2, …
## $ AREA <chr> "PRODUCCION 1", "CALIDAD", "PRODUCCION 1", "PRODUCCION 1"…
## $ ID_CAT <chr> "G", "F", "F", "F", "F", "E", "F", "F", "G", "F", "F", "F…
## $ N_CATEG <chr> "Cat : G", "Cat : F", "LIDER DE EQUIPO", "LIDER DE EQUIPO…
## $ PUESTO <chr> "TEC. MANTENIMIENTO", "VOLANTE", "JEFE", "LIDER DE EQUIPO…
## $ SUELDO <dbl> 25129, 24474, 44344, 34235, 26401, 26682, 23851, 25811, 2…
## $ carga_social <dbl> 4271.93, 4160.58, 7538.48, 5819.95, 4488.17, 4535.94, 405…
## $ costo_anual <dbl> 382212.1, 372249.5, 674472.2, 520714.3, 401559.2, 405833.…
Tidyverse es un paquete que está en continuo desarrollo. Pueden explorar el contenido actualizado en tidyverse.org y aprender más sobre su uso en el libro R para Ciencia de Datos.
Recuerden hacer todas las consultas en el canal #auxilio en Slack