Capítulo 2 Almacenando y manipulando datos.

2.1 Objetos. Datos.

Como vimos en el capítulo 1, tras ejecutar un sencillo script (o al escribir instrucciones directamente desde la consola), R es interactivo: responde a las entradas que recibe. Las entradas o expresiones pueden ser, básicamente básicamente:

  • Expresiones aritméticas.

  • Expresiones lógicas.

  • Llamadas a funciones.

  • Asignaciones.

Las expresiones realizan acciones sobre objetos de R. Los objetos en R son entes que tienen ciertas características, metadatos, llamados atributos. No todos los objetos tienen los mismos atributos y, ni tan siquiera, todos los objetos tienen atributos que los caractericen.

Los objetos más importantes en R son ciertas estructuras o contenedores diseñados para almacenar elementos:

  • Vectores.

  • Matrices.

  • Listas.

  • Data frames.

  • Factores.

Los elementos almacenados en los objetos se dividen en clases. Entre las diferentes clases, destacan las clases referidas a datos, que pueden ser de diferentes modos: logical (verdadero/falso), numeric (números) o character (cadena de texto). El modo numeric puede ser, a la vez, de tipo integer (número entero) o double (número real). En el caso de logical y carácter, modo y tipo coinciden.

Vamos a profundizar un poco en algunas de estos contenedores de datos. Vamos a suponer que trabajamos en el proyecto que creamos en el capítulo anterior (proyecto “explora”), y que vamos a editar el script que también creamos en tal capítulo (script “explorando.R”, que se encontrará ubicado en la carpeta del proyecto “explora”).

2.1.1 Vectores.

Los vectores, son conjuntos de elementos de la misma clase. Vamos a definir por ejemplo el vector x = (1,3,5,8). Para ello, vamos a escribir en nuestro script:

x <- c(1,3,5,8)

Ejecutamos la línea (situando el cursor en algún lugar de ella, dentro del script; y pulsando a la vez las teclas Control + Enter o pinchando con el ratón en el botón Run del editor). Ya tenemos nuestro primer objeto de tipo vector en memoria. Por cierto, lo que hemos hecho es una asignación, que se escribe con una flecha creada mediante los signos “<” y “-”. Hemos asignado a un vector llamado “x” los elementos 1, 3, 5 y 8.

Para ver el vector simplemente escribimos en la consola (o en el script) el nombre del vector, “x”. El resultado será:

## [1] 1 3 5 8

Además, si miramos en la ventana superior-derecha de R-Studio, veremos que en el Global Environment se muestra nuestro vector y que, además, se nos informa de que tiene modo numérico. El Global Environment nos informa de los objetos que R tiene en memoria:

Nuestro vector en memoria.
Nuestro vector en memoria.

Si queremos obtener un vector de números consecutivos del 2 al 6, basta con ejecutar en la “consola” (o escribir y ejecutar en el script):

y <- c(2:6)

Al escribir el nombre del vector “y” en la “consola” obtendremos:

y
## [1] 2 3 4 5 6

Si queremos saber la longitud de un vector, usaremos la función length(). Por ejemplo, length(y) nos devolverá el valor 5. Escribamos en el script y ejecutemos:

length(y)
## [1] 5

Un vector puede incluir, además de números, caracteres o grupos de caracteres alfanuméricos; siempre entrecomillados (lo fundamental es que sean elementos de la misma clase). Por ejemplo, el vector “genero” (¡no pongamos tildes o podemos tener problemas!). Así, si ejecutamos estas dos líneas de código:

genero<-c("Mujer","Hombre")
genero

Se habrá creado el vector “genero”:

## [1] "Mujer"  "Hombre"

Podemos obtener la clase de los elementos almacenados en nuestro vector con la función class():

class(genero)
## [1] "character"

Si falta un dato en un vector, habrá que escribir “NA” (not available). Por ejemplo, si falta el tercer dato de este vector “z”, este vector se escribirá como:

Z <- c(1,2,NA,2,8)

Para seleccionar un elemento concreto de un vector, indicaremos entre corchetes la posición en la que se encuentra. Por ejemplo, refiriéndonos al vector “x”, para obtener el valor de su tercer elemento, haremos:

x[3]
## [1] 5

Si queremos que se nos muestre los elementos del vector x del 2º al 4º:

x[2:4]
## [1] 3 5 8

Por último, si queremos sacar en pantalla los elementos 1º y 4º, tendremos que incluir una “c” seguida de un paréntesis que recoja el orden de los elementos que queremos seleccionar:

x[c(1,4)]
## [1] 1 8

2.1.2 Matrices.

Las matrices, internamente en R, son vectores; pero con dos atributos adicionales: número de filas y número de columnas. Se definen mediante la función matrix(). Por ejemplo, para definir la matriz “a”:

\[ \begin{pmatrix} 1 & 4 & 7 \\ 2 & 5 & 8 \\ 3 & 6 & 9 \end{pmatrix} \] Tendremos que escribir:

a <- matrix(c(1,2,3,4,5,6,7,8,9),nrow=3)
a
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

El número de filas de la matriz (y por tanto, el número de columnas) se fija con el argumento nrow = . También podríamos fijar el número de columnas, con ncol = .

Como vemos, por defecto, R va “cortando” el vector por columnas (si lo preferimos, lo puede hacer también por filas, añadiendo a la función matrix() el argumento by row = true; pero, en nuestro ejemplo, obtendríamos la matriz traspuesta a la que queremos almacenar).

Las dimensiones (número de filas y de columnas) de la matriz pueden obtenerse mediante la función dim():

dim(a)
## [1] 3 3

3 filas y 3 columnas.

Si queremos seleccionar elementos concretos de una matriz, lo haremos utilizando corchetes para indicar filas y columnas. Hemos de tener en cuenta que, trabajando con matrices, siempre tenemos \[rango de filas, rango de columnas\]. Si se deja en blanco el espacio entre el corchete inicial y la coma, esto querrá decir que consideramos todas las filas. Y si no insertamos nada entre la coma y el corchete de cierre, esto significará que consideramos todas las columnas. A continuación tenemos varios ejemplos de código, con el resultado obtenido en la consola:

a[2,3]
## [1] 8
a[1:2,2:3] 
##      [,1] [,2]
## [1,]    4    7
## [2,]    5    8
a[,c(1,3)]
##      [,1] [,2]
## [1,]    1    7
## [2,]    2    8
## [3,]    3    9
a[c(1,3),]
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    3    6    9

Tanto para vectores como para matrices, funcionan las operaciones suma y diferencia sin más complicaciones. En el caso del producto, sin embargo, hay que tener en cuenta que, por ejemplo, a*a devuelve la multiplicación elemento a elemento, es decir:

a*a

Devuelve la multiplicación elemento a elemento (en este caso, el cuadrado de cada número, al multiplicar la matriz a por sí misma):

##      [,1] [,2] [,3]
## [1,]    1   16   49
## [2,]    4   25   64
## [3,]    9   36   81

Para hacer el verdadero producto matricial deberá introducirse:

a%*%a
##      [,1] [,2] [,3]
## [1,]   30   66  102
## [2,]   36   81  126
## [3,]   42   96  150

2.1.3 Data frames.

Un data frame es un objeto que almacena datos organizados mediante la clase data.frame. Esta organización consiste en que, por filas, se disponen los diferentes casos o sujetos; mientras que por columnas se posicionan las variables. Así:

  • Es similar a una matriz en el sentido de que tiene dos dimensiones. Podemos acceder a sus elementos con corchetes, tenemos nombres de filas y columnas, y podemos operar con ellas.

  • Cada columna tiene un nombre, de manera que podemos acceder a una columna concreta con el símbolo $. Todas las columnas (variables) son vectores con la misma longitud.

  • Cada columna puede ser un vector numérico, factor, de tipo carácter o lógico.

Por ejemplo, vamos a crear el data frame “datos”, con tres variables: “peso”, “altura”, y “color de ojos”, llamadas “Peso”, “Altura” y “Cl.ojos”, respectivamente; para 3 individuos o casos. Una opción es crear primero las tres variables como vectores, y luego crear el data frame mediante la función dataframe():

Peso<-c(68,75,88)
Altura<-c(1.6,1.8,1.9)
Cl.ojos<-c("azules","marrones","marrones")
datos<-data.frame(Peso,Altura,Cl.ojos)

Si ahora ejecutamos una línea con el nombre de nuestro data frame, lo obtendremos como resultado en la consola:

datos
##   Peso Altura  Cl.ojos
## 1   68    1.6   azules
## 2   75    1.8 marrones
## 3   88    1.9 marrones

Para obtener los nombres de las variables (es decir, el nombre de cada columna) teclearemos la función:

names(datos)

Obteniéndose:

## [1] "Peso"    "Altura"  "Cl.ojos"

Para obtener solo los datos de la columna (variable) color de ojos teclearemos datos$Cl.ojos:

datos$Cl.ojos
## [1] "azules"   "marrones" "marrones"

Y para obtener los datos de peso: datos$Peso:

datos$Peso
## [1] 68 75 88

Para saber el número de filas y de columnas de una hoja de datos utilizaremos las funciones nrow() y ncol():

nrow(datos)
## [1] 3
ncol(datos)
## [1] 3

Para seleccionar elementos de un data frame, se pueden seguir las mismas reglas que para la selección de elementos de una matriz (con el número de cada fila, que es cada individuo; y el número de cada columna, que es cada variable. Para elegir una variable, no obstante, ya hemos visto que es posible usar su nombre; aunque precedido del nombre del data frame y el signo $. Por ejemplo, si ejecutamos:

datos[,2]
## [1] 1.6 1.8 1.9
datos$Altura
## [1] 1.6 1.8 1.9

Obtenemos el mismo resultado.

2.2 Importando datos.

Lo más frecuente es que no tecleemos los datos, como hemos hecho hasta ahora; sino que los importemos a R desde algún contenedor externo (archivo de texto, hoja de cálculo, base de datos…). Nosotros vamos a importar nuestros datos desde Microsoft® Excel®. Vamos a cerrar el script que hemos estado construyendo en los apartados anteriores (para conservarlo hay que guardarlo antes), aunque vamos a seguir trabajando en el mismo proyecto (que habíamos llamado, por ejemplo, “explora”). Iremos a la carpeta del proyecto y guardaremos en ella los dos archivos de esta práctica (obtén el el enlace a los archivos en la sección final del capítulo):

  • Un archivo de Microsoft® Excel® llamado “eolica_20.xlsx”

  • Un script con las instrucciones que vamos a mostrar a continuación, y que se llama “explora_eolica.R”

Si abrimos el archivo de Microsoft® Excel® comprobaremos que se compone de tres hojas. La primera muestra el criterio de búsqueda de casos en la un aviso sobre el uso exclusivo que se debe dar a los datos incorporados; la segunda recoge la descripción de las variables consideradas; y la tercera (hoja “Top 20”) guarda los datos que debemos importar desde R-Studio. Estos datos se corresponden con diferentes variables económico-financieras de 20 empresas productoras de electricidad mediante generación eólica. Luego vamos a cerrar el archivo de Microsoft® Excel® y volveremos a R-Studio. Vamos a abrir nuestro script “explora_eolica.R” con File → Open File… Este script contiene el programa que vamos a ir ejecutando en la práctica. La primera línea / instrucción en los scripts suele ser:

rm(list = ls())

La instrucción tiene como objeto limpiar el Environment (memoria) de objetos de anteriores sesiones de trabajo. Para importar los datos localizados en el archivo de Excel “eolica_20.xlsx” el código es:

# DATOS
library(readxl)
eolica_20 <- read_excel("eolica_20.xlsx", sheet = "Top 20")

¡Atención! Si nunca se ha utilizado el paquete {readxl} (que contiene el código necesario para importar datos de un archivo de Microsoft® Excel®), cuando la intentemos activar con la función library() nos dará un error o nos dirá que previamente hay que importarla. En ese caso, iremos a la ventana inferior-derecha y pulsaremos la pestaña Packages, pulsaremos en Install, y emergerá una ventana donde dejaremos el “repositorio” que viene por defecto y, en el campo “Packages”, escribiremos el nombre del “paquete” que contiene la librería que nos hace falta (normalmente coincide con el nombre de la propia librería, en nuestro caso {readxl}. Una vez descargado el “paquete”, podremos ejecutar el código anterior sin problemas.

Otra cuestión importante a tener en cuenta es que, en la hoja de cálculo del ejemplo, los “valores perdidos” o missing values (celdas en las que no hay datos), venían en blanco. Pero, en ocasiones, pueden contener algún tipo de anotación, como por ejemplo, “n.d.” (no disponible). En tal caso, deberá incluirse un argumento más que informe de estas celdas que, sin estar en blanco, no tienen dato:

eolica_20 <- read_excel("eolica_20.xlsx", sheet = "Top 20", na = c("n.d."))

Volviendo a nuestro ejemplo, podemos observar cómo en el Environment ya aparece un objeto. Este objeto es una estructura de datos tipo data frame, se llama “eolica_20” y contiene 11 columnas, una por cada una de las variables almacenadas en el archivo de Microsoft® Excel®. De estas variables, tres son de tipo cualitativo, formadas por cadenas de caracteres: el nombre de la empresa, “NOMBRE”; y el nombre del grupo empresarial matriz al que pertenece, “MATRIZ”. Puede explorarse el contenido del data frame y los principales estadísticos con la función summary():

summary (eolica_20)
##     NOMBRE               RES             ACTIVO             FPIOS        
##  Length:20          Min.   : -5662   Min.   :  109024   Min.   : -77533  
##  Class :character   1st Qu.:  2865   1st Qu.:  187240   1st Qu.:  27615  
##  Mode  :character   Median :  7388   Median :  271636   Median :  77740  
##                     Mean   : 50754   Mean   : 1183599   Mean   : 563678  
##                     3rd Qu.: 21206   3rd Qu.:  813816   3rd Qu.: 219345  
##                     Max.   :727548   Max.   :13492812   Max.   :6904824  
##                     NA's   :1                                            
## 
##      RENECO            RENFIN            LIQUIDEZ          MARGEN       
##  Min.   :-2.8130   Min.   :-359.773   Min.   :0.0780   Min.   :-302.03  
##  1st Qu.: 0.8765   1st Qu.:   1.664   1st Qu.:0.7342   1st Qu.:  12.39  
##  Median : 3.6150   Median :  10.812   Median :1.2345   Median :  21.42  
##  Mean   : 2.9399   Mean   :  -3.450   Mean   :1.4200   Mean   :  16.40  
##  3rd Qu.: 4.7735   3rd Qu.:  25.312   3rd Qu.:1.5615   3rd Qu.:  38.56  
##  Max.   : 8.5860   Max.   :  52.261   Max.   :5.3300   Max.   : 208.36  
##  NA's   :1                                                              
## 
##    SOLVENCIA         APALANCA           MATRIZ         
##  Min.   :-40.74   Min.   :-6265.50   Length:20         
##  1st Qu.: 11.26   1st Qu.:   16.13   Class :character  
##  Median : 23.68   Median :  145.93   Mode  :character  
##  Mean   : 32.68   Mean   :  -17.17                     
##  3rd Qu.: 52.62   3rd Qu.:  504.74                     
##  Max.   : 99.08   Max.   : 1019.62

Veremos cómo aparecen 11 variables con algunos estadísticos básicos.

R ha considerado la primera columna como una variable de tipo cualitativo (atributo o factor). En realidad no es una variable, sino el nombre de los individuos o casos. Para evitar que R tome los nombres de los casos como una variable, podemos redefinir nuestro data frame diciéndole que considere esa primera columna como los nombres de los individuos o filas:

eolica_20 <- data.frame(eolica_20, row.names = 1)

En la línea anterior hemos asignado al data frame “eolica_20” los propios datos de “eolica_20”; pero indicando que la primera columna de datos no es una variable; sino el nombre de los casos. Si hacemos ahora el summary():

##       RES             ACTIVO             FPIOS             RENECO       
##  Min.   : -5662   Min.   :  109024   Min.   : -77533   Min.   :-2.8130  
##  1st Qu.:  2865   1st Qu.:  187240   1st Qu.:  27615   1st Qu.: 0.8765  
##  Median :  7388   Median :  271636   Median :  77740   Median : 3.6150  
##  Mean   : 50754   Mean   : 1183599   Mean   : 563678   Mean   : 2.9399  
##  3rd Qu.: 21206   3rd Qu.:  813816   3rd Qu.: 219345   3rd Qu.: 4.7735  
##  Max.   :727548   Max.   :13492812   Max.   :6904824   Max.   : 8.5860  
##  NA's   :1                                             NA's   :1        
## 
##      RENFIN            LIQUIDEZ          MARGEN          SOLVENCIA     
##  Min.   :-359.773   Min.   :0.0780   Min.   :-302.03   Min.   :-40.74  
##  1st Qu.:   1.664   1st Qu.:0.7342   1st Qu.:  12.39   1st Qu.: 11.26  
##  Median :  10.812   Median :1.2345   Median :  21.42   Median : 23.68  
##  Mean   :  -3.450   Mean   :1.4200   Mean   :  16.40   Mean   : 32.68  
##  3rd Qu.:  25.312   3rd Qu.:1.5615   3rd Qu.:  38.56   3rd Qu.: 52.62  
##  Max.   :  52.261   Max.   :5.3300   Max.   : 208.36   Max.   : 99.08  
## 
##     APALANCA           MATRIZ         
##  Min.   :-6265.50   Length:20         
##  1st Qu.:   16.13   Class :character  
##  Median :  145.93   Mode  :character  
##  Mean   :  -17.17                     
##  3rd Qu.:  504.74                     
##  Max.   : 1019.62

Vemos que ya no aparece “NOMBRE” como variable, y en el Environment ya aparece el data frame “eolica_20” con 20 observaciones (casos), pero con 10 variables (una menos).

Antes de seguir con la manipulación de nuestros datos, es preciso decir que existen otros muchos formatos de datos que pueden ser importados. Por ejemplo, con el paquete {readr} se pueden importar datos de archivos de texto de tipo tabular (por ejemplo, archivos *.csv). Con el paquete {haven} se pueden capturar los datos almacenados en archivos de SPSS® (.sav), Stata® (.dta), SAS® (.sas7bdat), etc. Finamente, se pueden capturar datos almacenados en páginas web (archivos en formato JSON o XML, o en tablas HTML)) o en bases de datos gestionadas mediante diversos sistemas (SQLite, MySQL, MariaDB, PostgreSQL, Oracle®).

2.3 {dplyr}.

2.3.1 El Tidyverse. Cargando {dplyr}.

El Tidyverse es un conjunto de paquetes / librerías con una filosofía común, como es el uso de ciertas estructuras gramaticales, que facilitan muchas de las tareas y análisis que podrían hacerse con el lenguaje R estándar. Una buena obra para profundizar en el Tidyverse es Wickham and Grolemund (2017).

Uno de esos paquetes es {dplyr}, que proporciona una gramática más sencilla que la del lenguaje R convencional para manipular los objetos de estructuras de datos conocidos como data frames.

Los data frames, como ya sabemos, son estructuras en las que se almacenan datos de modo que, por columnas, se disponen las variables del análisis; y por filas los casos que conforman la muestra / población.

Vamos a suponer que trabajamos dentro del proyecto que hemos creado previamente, de nombre “explora” (ver capítulo 1). Dentro de la carpeta del proyecto guardaremos el script llamado “explora_dplyr.R” y el archivo de Microsoft® Excel® llamado “eolica_20.xlsx”. Si abrimos este último archivo, comprobaremos que se compone de tres hojas. La hoja “Top 20” contiene los datos a importar desde R-Studio. Estos datos se corresponden con diferentes variables económico-financieras de 20 empresas productoras de electricidad mediante generación eólica.

Luego cerraremos el archivo de Microsoft® Excel®, “eolica_20.xlsx”, y volveremos a R-Studio. Después, abriremos nuestro script “explora_dplyr.R” con File → Open File… Este script contiene el programa que vamos a ir ejecutando en la práctica.

La primera línea / instrucción en los scripts suele ser:

rm(list = ls())

La instrucción tiene como objeto limpiar el Environment (memoria) de objetos de anteriores sesiones de trabajo.

Para importar los datos que hay en la hoja “Top 20” del archivo de Microsoft® Excel® llamado “eolica_20.xlsx”, ejecutaremos el código:

# DATOS

library(readxl)
eolica_20 <- read_excel("eolica_20.xlsx", sheet = "Top 20")

Podemos observar como en el Environment ya aparece un objeto. Este objeto es una estructura de datos tipo data frame, se llama “eolica_20” y contiene 11 columnas. R ha considerado la primera columna como una variable de tipo cualitativo. En realidad, la primera columna no es una variable, sino que está formada por el nombre (identificador) de los diferentes casos u observaciones. Para evitar que R tome los nombres de los casos como una variable más, podemos redefinir nuestro data frame diciéndole que tome esa primera columna como los nombres de los individuos:

eolica_20 <- data.frame(eolica_20, row.names = 1)

En la línea anterior hemos asignado al data frame “eolica_20” los propios datos de “eolica_20”; pero indicando que la primera columna de datos no es una variable; sino el nombre de los casos.

A continuación, cargaremos el paquete {dplyr}. Si nunca antes se ha utilizado este paquete, cuando lo intentemos activar con la función library() nos dará un error o nos dirá que previamente hay que importarlo. En ese caso, iremos a la ventana inferior-derecha y pulsaremos la pestaña “Packages”, pulsaremos en Install, y emergerá una ventana donde dejaremos el “repositorio” que viene por defecto y, en el campo Packages, escribiremos el nombre del “paquete” (en nuestro caso {dplyr}). Una vez descargado el “paquete”, podremos ejecutar el código sin problemas:

#Cargando dplyr

library (dplyr)

Para entender mejor la sintaxis que siguen las funciones o instrucciones a las que da acceso {dplyr}, hay que tener en cuenta lo siguiente:

  • El primer argumento que tiene una función de {dplyr} es el data frame con el que se va a trabajar.

  • Los otros argumentos describen qué hay que hacer con el data frame especificado en el primer argumento. Es posible referirse a las columnas (variables) del data frame con su nombre, sin utilizar el operador $.

  • El valor de retorno es un nuevo data frame.

En los siguientes subapartados practicaremos con algunas de las principales funciones que aporta {dplyr}.

2.3.2 Seleccionando columnas de un data frame.

La función clave de {dplyr} para seleccionar una o varias columnas (variables) de un data frame es la función select().

Así, vamos a imaginar por ejemplo que queremos eliminar de nuestro data frame la variable (de tipo “carácter”) MATRIZ. Podremos ejecutar la asignación:

#Seleccionando variables

eolica_20 <-select(eolica_20, -MATRIZ)
summary (eolica_20)
##       RES             ACTIVO             FPIOS        
##  Min.   : -5662   Min.   :  109024   Min.   : -77533  
##  1st Qu.:  2865   1st Qu.:  187240   1st Qu.:  27615  
##  Median :  7388   Median :  271636   Median :  77740  
##  Mean   : 50754   Mean   : 1183599   Mean   : 563678  
##  3rd Qu.: 21206   3rd Qu.:  813816   3rd Qu.: 219345  
##  Max.   :727548   Max.   :13492812   Max.   :6904824  
##  NA's   :1                                            
## 
##      RENECO            RENFIN            LIQUIDEZ     
##  Min.   :-2.8130   Min.   :-359.773   Min.   :0.0780  
##  1st Qu.: 0.8765   1st Qu.:   1.664   1st Qu.:0.7342  
##  Median : 3.6150   Median :  10.812   Median :1.2345  
##  Mean   : 2.9399   Mean   :  -3.450   Mean   :1.4200  
##  3rd Qu.: 4.7735   3rd Qu.:  25.312   3rd Qu.:1.5615  
##  Max.   : 8.5860   Max.   :  52.261   Max.   :5.3300  
##  NA's   :1                                            
## 
##      MARGEN          SOLVENCIA         APALANCA       
##  Min.   :-302.03   Min.   :-40.74   Min.   :-6265.50  
##  1st Qu.:  12.39   1st Qu.: 11.26   1st Qu.:   16.13  
##  Median :  21.42   Median : 23.68   Median :  145.93  
##  Mean   :  16.40   Mean   : 32.68   Mean   :  -17.17  
##  3rd Qu.:  38.56   3rd Qu.: 52.62   3rd Qu.:  504.74  
##  Max.   : 208.36   Max.   : 99.08   Max.   : 1019.62

Podemos verificar que, en el Environment, el data frame ha pasado a tener una variable menos (9), ya que hemos eliminado la variable MATRIZ. Es decir, con el guión “-” se pueden eliminar directamente variables de un data frame.

Ahora, suponemos que queremos visualizar las variables del data frame “eolica_20”: ACTIVO, FPIOS, LIQUIDEZ, MARGEN, SOLVENCIA y APALANCA (es decir, todas las variables menos RES, RENECO, RENFIN). Para ello, ejecutaremos el código:

select(eolica_20, ACTIVO, FPIOS, LIQUIDEZ, MARGEN, SOLVENCIA, APALANCA)
##                                     ACTIVO       FPIOS LIQUIDEZ   MARGEN
## Holding De Negocios De GAS SL.  13492812.0 6904824.000    1.020   91.152
## Global Power Generation SA.      2002458.0 1740487.000    2.006   22.403
## Naturgy Renovables SLU           1956869.0  318475.000    1.263   20.442
## EDP Renovables España SLU        1275939.0  726783.000    1.596   47.193
## Corporacion Acciona Eolica SL     864606.0  136064.000    0.788   20.091
## Saeta Yield SA.                   796886.4  665319.556    2.687   16.258
## Elawan Energy SL.                 443467.0  186302.006    0.595  208.357
## Olivento SL                       381207.0   58340.998    0.771   16.629
## Parque Eolico La Boga SL.         303904.4   29316.797    1.407    1.001
## Naturgy Wind, S.L.                273542.0   28418.000    1.364   39.575
## Viesgo Renovables SL.             269730.0  177707.000    0.272   11.818
## Al-Andalus Wind Power SL          249853.8   21466.121    1.550   12.582
## Innogy Spain SA.                  230338.5   85447.212    1.416  -18.025
## Guzman Energia SL                 190287.0  -77532.698    0.078  -19.193
## Acciona Eolica Del Levante SL     188354.0   21769.000    2.855   27.520
## Biovent Energia SA                183899.0   70033.000    1.206   22.792
## Esquilvent SL                     157630.6   48769.130    5.330   39.476
## Eolica La Janda SL                153429.4   25206.748    1.184   38.256
## Parque Eolico Santa Catalina SL   147742.5   -1664.755    0.388   31.780
## WPD Wind Investment SL.           109023.8  108023.826    0.624 -302.027
## 
##                                 SOLVENCIA  APALANCA
## Holding De Negocios De GAS SL.     51.174    91.964
## Global Power Generation SA.        86.917     1.044
## Naturgy Renovables SLU             16.274   494.729
## EDP Renovables España SLU          56.960    67.028
## Corporacion Acciona Eolica SL      15.737   422.263
## Saeta Yield SA.                    83.489    17.067
## Elawan Energy SL.                  42.010   123.771
## Olivento SL                        15.304   534.761
## Parque Eolico La Boga SL.           9.646   921.591
## Naturgy Wind, S.L.                 10.388   824.537
## Viesgo Renovables SL.              65.883    13.330
## Al-Andalus Wind Power SL            8.591  1019.616
## Innogy Spain SA.                   37.096   150.688
## Guzman Energia SL                 -40.745  -343.542
## Acciona Eolica Del Levante SL      11.557   743.754
## Biovent Energia SA                 38.082   141.163
## Esquilvent SL                      30.938   218.275
## Eolica La Janda SL                 16.428   480.122
## Parque Eolico Santa Catalina SL    -1.126 -6265.496
## WPD Wind Investment SL.            99.082     0.000

Como no hemos asignado el resultado de la función a ningún “nombre”, R simplemente saca el resultado en pantalla; pero no guarda ningún objeto en el Environment. Si un select() lo asignamos a un “nombre”, se creará un data frame con ese nombre, y las variables seleccionadas:

eolica_20A <-select(eolica_20, ACTIVO, FPIOS, LIQUIDEZ, MARGEN, SOLVENCIA, APALANCA)
summary (eolica_20A)
##       RES             ACTIVO             FPIOS        
##  Min.   : -5662   Min.   :  109024   Min.   : -77533  
##  1st Qu.:  2865   1st Qu.:  187240   1st Qu.:  27615  
##  Median :  7388   Median :  271636   Median :  77740  
##  Mean   : 50754   Mean   : 1183599   Mean   : 563678  
##  3rd Qu.: 21206   3rd Qu.:  813816   3rd Qu.: 219345  
##  Max.   :727548   Max.   :13492812   Max.   :6904824  
##  NA's   :1                                            
## 
##      RENECO            RENFIN            LIQUIDEZ     
##  Min.   :-2.8130   Min.   :-359.773   Min.   :0.0780  
##  1st Qu.: 0.8765   1st Qu.:   1.664   1st Qu.:0.7342  
##  Median : 3.6150   Median :  10.812   Median :1.2345  
##  Mean   : 2.9399   Mean   :  -3.450   Mean   :1.4200  
##  3rd Qu.: 4.7735   3rd Qu.:  25.312   3rd Qu.:1.5615  
##  Max.   : 8.5860   Max.   :  52.261   Max.   :5.3300  
##  NA's   :1                                            
## 
##      MARGEN          SOLVENCIA         APALANCA       
##  Min.   :-302.03   Min.   :-40.74   Min.   :-6265.50  
##  1st Qu.:  12.39   1st Qu.: 11.26   1st Qu.:   16.13  
##  Median :  21.42   Median : 23.68   Median :  145.93  
##  Mean   :  16.40   Mean   : 32.68   Mean   :  -17.17  
##  3rd Qu.:  38.56   3rd Qu.: 52.62   3rd Qu.:  504.74  
##  Max.   : 208.36   Max.   : 99.08   Max.   : 1019.62

Podemos comprobar en el Environment cómo hay otro objeto data frame llamado “eolica_20A”, con 6 variables (y los mismos 20 casos). Este data frame lo podríamos haber creado, también, eliminando del data frame original (“eolica_20”), las variables que nos sobran:

eolica_20A <-select(eolica_20, -RES, -RENECO, -RENFIN)

Más aún, si nos fijamos bien, los nombres de todas las variables que hemos excluido empiezan por “RE”, a diferencia de las incluidas. Podríamos haber hecho también:

eolica_20A <-select(eolica_20, -(starts_with("RE")))

Y de nuevo obtendríamos el mismo resultado. El argumento starts_with() permite seleccionar variables cuyos nombres comienzan por cierta cadena de caracteres. También se puede hacer mismo con los caracteres finales (ends_with()) o contenidos en alguna posición del nombre (contains()).

Otra posibilidad que tenemos es hacer una copia de un data frame rápidamente con el argumento everything(). Por ejemplo:

eolica_20_replica <-select(eolica_20, everything())

Se ha creado el date frame “eolica_20_replica” que es una copia exacta de “eolica_20”.

2.3.3 Seleccionando casos de un data frame.

Además de seleccionar variables, con {dplyr} también se pueden seleccionar casos que cumplan ciertas condiciones. La función para realizar este cometido es filter(). Por ejemplo, si queremos seleccionar las empresas eólicas con un resultado (variable RES) mayor o igual a 50.000 y presentarlas en pantalla, la instrucción será:

filter(eolica_20, RES >= 50000)
##                                   RES   ACTIVO   FPIOS RENECO RENFIN
## Holding De Negocios De GAS SL. 727548 13492812 6904824  5.264 10.287
## EDP Renovables España SLU       67033  1275939  726783  6.458 11.338
## 
##                                LIQUIDEZ MARGEN SOLVENCIA APALANCA
## Holding De Negocios De GAS SL.    1.020 91.152    51.174   91.964
## EDP Renovables España SLU         1.596 47.193    56.960   67.028

Se pueden incluir varias condiciones en un mismo filtro. Por ejemplo, vamos a construir un nuevo data frame llamado “eolica_20B” con las empresas que posean un resultado mayor o igual a 50000 y una rentabilidad económica (variable RENECO) inferior al 6%:

eolica_20B <-filter(eolica_20, RES >= 50000 & RENECO < 6)
eolica_20B
##                                   RES   ACTIVO   FPIOS
## Holding De Negocios De GAS SL. 727548 13492812 6904824
## 
##                                RENECO RENFIN LIQUIDEZ
## Holding De Negocios De GAS SL.  5.264 10.287     1.02
## 
##                                MARGEN SOLVENCIA APALANCA
## Holding De Negocios De GAS SL. 91.152    51.174   91.964

En el Environment aparecerá el data frame “eolica_9B” con solo un caso: la empresa que cumple con ambas condiciones, introducidas mediante el operador lógico relacional “&”, que es el equivalente a la conjunción “y” o, dicho de otro modo, la intersección. Otro operador lógico relacional muy utilizado es la barra vertical “|”, que es el equivalente a la conjunción “o”, es decir, la unión.

Los filtros más usuales son >, <, >=, <=, == (igual, ojo, con dos símbolos de igualdad seguidos) y != (no igual).

2.3.4 Ordenando casos de un data frame.

Además de seleccionar determinados casos u observaciones (filas) de un data frame, con las funciones de {dplyr} también se pueden ordenar estos casos a partir de los valores de ciertas variables (columnas). La función a utilizar es arrange(). Esta función, por defecto, ordena los casos de modo ascendente. Por ejemplo:

arrange(eolica_20, RENECO)
##                                        RES     ACTIVO       FPIOS
## Guzman Energia SL                -5661.463   190287.0  -77532.698
## Innogy Spain SA.                 -5268.573   230338.5   85447.212
## WPD Wind Investment SL.           -850.068   109023.8  108023.826
## Parque Eolico La Boga SL.           11.940   303904.4   29316.797
## Saeta Yield SA.                   2084.476   796886.4  665319.556
## Global Power Generation SA.      39995.000  2002458.0 1740487.000
## Naturgy Renovables SLU           42737.000  1956869.0  318475.000
## Al-Andalus Wind Power SL          4403.214   249853.8   21466.121
## Olivento SL                       7388.175   381207.0   58340.998
## Elawan Energy SL.                12818.975   443467.0  186302.006
## Naturgy Wind, S.L.                8500.000   273542.0   28418.000
## Parque Eolico Santa Catalina SL   3645.278   147742.5   -1664.755
## Biovent Energia SA                      NA   183899.0   70033.000
## Corporacion Acciona Eolica SL    29592.000   864606.0  136064.000
## Acciona Eolica Del Levante SL     6853.000   188354.0   21769.000
## Holding De Negocios De GAS SL.  727548.000 13492812.0 6904824.000
## EDP Renovables España SLU        67033.000  1275939.0  726783.000
## Esquilvent SL                     9010.214   157630.6   48769.130
## Eolica La Janda SL                9880.091   153429.4   25206.748
## Viesgo Renovables SL.             4609.000   269730.0  177707.000
## 
##                                 RENECO   RENFIN LIQUIDEZ
## Guzman Energia SL               -2.813    6.904    0.078
## Innogy Spain SA.                -2.708   -7.302    1.416
## WPD Wind Investment SL.         -1.040   -1.049    0.624
## Parque Eolico La Boga SL.        0.162    1.684    1.407
## Saeta Yield SA.                  0.360    0.432    2.687
## Global Power Generation SA.      1.393    1.603    2.006
## Naturgy Renovables SLU           1.959   12.043    1.263
## Al-Andalus Wind Power SL         2.349   27.350    1.550
## Olivento SL                      2.553   16.684    0.771
## Elawan Energy SL.                3.615    8.605    0.595
## Naturgy Wind, S.L.               3.949   38.018    1.364
## Parque Eolico Santa Catalina SL  4.053 -359.773    0.388
## Biovent Energia SA               4.551   11.952    1.206
## Corporacion Acciona Eolica SL    4.562   28.990    0.788
## Acciona Eolica Del Levante SL    4.985   43.139    2.855
## Holding De Negocios De GAS SL.   5.264   10.287    1.020
## EDP Renovables España SLU        6.458   11.338    1.596
## Esquilvent SL                    7.621   24.633    5.330
## Eolica La Janda SL               8.586   52.261    1.184
## Viesgo Renovables SL.               NA    3.200    0.272
## 
##                                   MARGEN SOLVENCIA  APALANCA
## Guzman Energia SL                -19.193   -40.745  -343.542
## Innogy Spain SA.                 -18.025    37.096   150.688
## WPD Wind Investment SL.         -302.027    99.082     0.000
## Parque Eolico La Boga SL.          1.001     9.646   921.591
## Saeta Yield SA.                   16.258    83.489    17.067
## Global Power Generation SA.       22.403    86.917     1.044
## Naturgy Renovables SLU            20.442    16.274   494.729
## Al-Andalus Wind Power SL          12.582     8.591  1019.616
## Olivento SL                       16.629    15.304   534.761
## Elawan Energy SL.                208.357    42.010   123.771
## Naturgy Wind, S.L.                39.575    10.388   824.537
## Parque Eolico Santa Catalina SL   31.780    -1.126 -6265.496
## Biovent Energia SA                22.792    38.082   141.163
## Corporacion Acciona Eolica SL     20.091    15.737   422.263
## Acciona Eolica Del Levante SL     27.520    11.557   743.754
## Holding De Negocios De GAS SL.    91.152    51.174    91.964
## EDP Renovables España SLU         47.193    56.960    67.028
## Esquilvent SL                     39.476    30.938   218.275
## Eolica La Janda SL                38.256    16.428   480.122
## Viesgo Renovables SL.             11.818    65.883    13.330

En cambio, para ordenar de modo descendente, hay que utilizar el argumento desc():

arrange(eolica_20, desc(RENECO))
##                                        RES     ACTIVO       FPIOS
## Eolica La Janda SL                9880.091   153429.4   25206.748
## Esquilvent SL                     9010.214   157630.6   48769.130
## EDP Renovables España SLU        67033.000  1275939.0  726783.000
## Holding De Negocios De GAS SL.  727548.000 13492812.0 6904824.000
## Acciona Eolica Del Levante SL     6853.000   188354.0   21769.000
## Corporacion Acciona Eolica SL    29592.000   864606.0  136064.000
## Biovent Energia SA                      NA   183899.0   70033.000
## Parque Eolico Santa Catalina SL   3645.278   147742.5   -1664.755
## Naturgy Wind, S.L.                8500.000   273542.0   28418.000
## Elawan Energy SL.                12818.975   443467.0  186302.006
## Olivento SL                       7388.175   381207.0   58340.998
## Al-Andalus Wind Power SL          4403.214   249853.8   21466.121
## Naturgy Renovables SLU           42737.000  1956869.0  318475.000
## Global Power Generation SA.      39995.000  2002458.0 1740487.000
## Saeta Yield SA.                   2084.476   796886.4  665319.556
## Parque Eolico La Boga SL.           11.940   303904.4   29316.797
## WPD Wind Investment SL.           -850.068   109023.8  108023.826
## Innogy Spain SA.                 -5268.573   230338.5   85447.212
## Guzman Energia SL                -5661.463   190287.0  -77532.698
## Viesgo Renovables SL.             4609.000   269730.0  177707.000
## 
##                                 RENECO   RENFIN LIQUIDEZ
## Eolica La Janda SL               8.586   52.261    1.184
## Esquilvent SL                    7.621   24.633    5.330
## EDP Renovables España SLU        6.458   11.338    1.596
## Holding De Negocios De GAS SL.   5.264   10.287    1.020
## Acciona Eolica Del Levante SL    4.985   43.139    2.855
## Corporacion Acciona Eolica SL    4.562   28.990    0.788
## Biovent Energia SA               4.551   11.952    1.206
## Parque Eolico Santa Catalina SL  4.053 -359.773    0.388
## Naturgy Wind, S.L.               3.949   38.018    1.364
## Elawan Energy SL.                3.615    8.605    0.595
## Olivento SL                      2.553   16.684    0.771
## Al-Andalus Wind Power SL         2.349   27.350    1.550
## Naturgy Renovables SLU           1.959   12.043    1.263
## Global Power Generation SA.      1.393    1.603    2.006
## Saeta Yield SA.                  0.360    0.432    2.687
## Parque Eolico La Boga SL.        0.162    1.684    1.407
## WPD Wind Investment SL.         -1.040   -1.049    0.624
## Innogy Spain SA.                -2.708   -7.302    1.416
## Guzman Energia SL               -2.813    6.904    0.078
## Viesgo Renovables SL.               NA    3.200    0.272
## 
##                                   MARGEN SOLVENCIA  APALANCA
## Eolica La Janda SL                38.256    16.428   480.122
## Esquilvent SL                     39.476    30.938   218.275
## EDP Renovables España SLU         47.193    56.960    67.028
## Holding De Negocios De GAS SL.    91.152    51.174    91.964
## Acciona Eolica Del Levante SL     27.520    11.557   743.754
## Corporacion Acciona Eolica SL     20.091    15.737   422.263
## Biovent Energia SA                22.792    38.082   141.163
## Parque Eolico Santa Catalina SL   31.780    -1.126 -6265.496
## Naturgy Wind, S.L.                39.575    10.388   824.537
## Elawan Energy SL.                208.357    42.010   123.771
## Olivento SL                       16.629    15.304   534.761
## Al-Andalus Wind Power SL          12.582     8.591  1019.616
## Naturgy Renovables SLU            20.442    16.274   494.729
## Global Power Generation SA.       22.403    86.917     1.044
## Saeta Yield SA.                   16.258    83.489    17.067
## Parque Eolico La Boga SL.          1.001     9.646   921.591
## WPD Wind Investment SL.         -302.027    99.082     0.000
## Innogy Spain SA.                 -18.025    37.096   150.688
## Guzman Energia SL                -19.193   -40.745  -343.542
## Viesgo Renovables SL.             11.818    65.883    13.330

En el supuesto de que, por ejemplo, hubiera varias empresas con la misma rentabilidad económica (RENECO), podría añadirse otro criterio de ordenación con otra variable, que afectaría a tales empresas para deshacer el “empate” en rentabilidad económica. Por ejemplo, para ordenar de modo ascendente por rentabilidad y, en caso de que haya rentabilidades iguales, por liquidez (variable LIQUIDEZ), se ejecutaría:

arrange(eolica_20, RENECO, LIQUIDEZ)
##                                        RES     ACTIVO       FPIOS
## Guzman Energia SL                -5661.463   190287.0  -77532.698
## Innogy Spain SA.                 -5268.573   230338.5   85447.212
## WPD Wind Investment SL.           -850.068   109023.8  108023.826
## Parque Eolico La Boga SL.           11.940   303904.4   29316.797
## Saeta Yield SA.                   2084.476   796886.4  665319.556
## Global Power Generation SA.      39995.000  2002458.0 1740487.000
## Naturgy Renovables SLU           42737.000  1956869.0  318475.000
## Al-Andalus Wind Power SL          4403.214   249853.8   21466.121
## Olivento SL                       7388.175   381207.0   58340.998
## Elawan Energy SL.                12818.975   443467.0  186302.006
## Naturgy Wind, S.L.                8500.000   273542.0   28418.000
## Parque Eolico Santa Catalina SL   3645.278   147742.5   -1664.755
## Biovent Energia SA                      NA   183899.0   70033.000
## Corporacion Acciona Eolica SL    29592.000   864606.0  136064.000
## Acciona Eolica Del Levante SL     6853.000   188354.0   21769.000
## Holding De Negocios De GAS SL.  727548.000 13492812.0 6904824.000
## EDP Renovables España SLU        67033.000  1275939.0  726783.000
## Esquilvent SL                     9010.214   157630.6   48769.130
## Eolica La Janda SL                9880.091   153429.4   25206.748
## Viesgo Renovables SL.             4609.000   269730.0  177707.000
## 
##                                 RENECO   RENFIN LIQUIDEZ
## Guzman Energia SL               -2.813    6.904    0.078
## Innogy Spain SA.                -2.708   -7.302    1.416
## WPD Wind Investment SL.         -1.040   -1.049    0.624
## Parque Eolico La Boga SL.        0.162    1.684    1.407
## Saeta Yield SA.                  0.360    0.432    2.687
## Global Power Generation SA.      1.393    1.603    2.006
## Naturgy Renovables SLU           1.959   12.043    1.263
## Al-Andalus Wind Power SL         2.349   27.350    1.550
## Olivento SL                      2.553   16.684    0.771
## Elawan Energy SL.                3.615    8.605    0.595
## Naturgy Wind, S.L.               3.949   38.018    1.364
## Parque Eolico Santa Catalina SL  4.053 -359.773    0.388
## Biovent Energia SA               4.551   11.952    1.206
## Corporacion Acciona Eolica SL    4.562   28.990    0.788
## Acciona Eolica Del Levante SL    4.985   43.139    2.855
## Holding De Negocios De GAS SL.   5.264   10.287    1.020
## EDP Renovables España SLU        6.458   11.338    1.596
## Esquilvent SL                    7.621   24.633    5.330
## Eolica La Janda SL               8.586   52.261    1.184
## Viesgo Renovables SL.               NA    3.200    0.272
## 
##                                   MARGEN SOLVENCIA  APALANCA
## Guzman Energia SL                -19.193   -40.745  -343.542
## Innogy Spain SA.                 -18.025    37.096   150.688
## WPD Wind Investment SL.         -302.027    99.082     0.000
## Parque Eolico La Boga SL.          1.001     9.646   921.591
## Saeta Yield SA.                   16.258    83.489    17.067
## Global Power Generation SA.       22.403    86.917     1.044
## Naturgy Renovables SLU            20.442    16.274   494.729
## Al-Andalus Wind Power SL          12.582     8.591  1019.616
## Olivento SL                       16.629    15.304   534.761
## Elawan Energy SL.                208.357    42.010   123.771
## Naturgy Wind, S.L.                39.575    10.388   824.537
## Parque Eolico Santa Catalina SL   31.780    -1.126 -6265.496
## Biovent Energia SA                22.792    38.082   141.163
## Corporacion Acciona Eolica SL     20.091    15.737   422.263
## Acciona Eolica Del Levante SL     27.520    11.557   743.754
## Holding De Negocios De GAS SL.    91.152    51.174    91.964
## EDP Renovables España SLU         47.193    56.960    67.028
## Esquilvent SL                     39.476    30.938   218.275
## Eolica La Janda SL                38.256    16.428   480.122
## Viesgo Renovables SL.             11.818    65.883    13.330

Obviamente, en este ejemplo concreto el resultado es el mismo que se obtuvo con arrange(eolica_20, RENECO), puesto que no hay rentabilidades iguales entre las 20 empresas de la muestra.

2.3.5 Cambiando el nombre de las variables de un data frame.

{dplyr} cuenta con una función que cambia fácilmente el nombre de una variable o columna de un data frame: la función rename(). Por ejemplo, si queremos cambiar el nombre de la variable SOLVENCIA por SOLVE, simplemente ejecutaremos:

#Renombrando variables
eolica_20 <- rename(eolica_20, SOLVE = SOLVENCIA)

Podemos comprobar en el Environment, despegando el objeto “eolica_20”, cómo ya no aparece la variable SOLVENCIA; pero sí SOLVE en su lugar (obviamente, con los mismos datos). Es necesario tener en cuenta que en el lado izquierdo de la igualdad hay que poner el nuevo nombre, y en la derecha el antiguo. Además, en el mismo rename() se pueden cambiar los nombres de varias variables, separando las igualdades correspondientes con comas.

2.3.6 Añadiendo variables como transformación de otras variables en un data frame.

El paquete {dplyr} también permite añadir a un data frame variables que son el resultado de someter a otras variables a diversas transformaciones. La función para realizar este cometido es mutate().

Así, por ejemplo, imaginemos que necesitamos calcular una variable como el cociente entre los resultados obtenidos y el activo. A esta nueva variable la denominaremos RATIO. El código será:

# Añadiendo variables como transformacion de otras variables
eolica_20 <- mutate (eolica_20, RATIO = RES / ACTIVO)
summary(eolica_20)
##       RES             ACTIVO             FPIOS             RENECO       
##  Min.   : -5662   Min.   :  109024   Min.   : -77533   Min.   :-2.8130  
##  1st Qu.:  2865   1st Qu.:  187240   1st Qu.:  27615   1st Qu.: 0.8765  
##  Median :  7388   Median :  271636   Median :  77740   Median : 3.6150  
##  Mean   : 50754   Mean   : 1183599   Mean   : 563678   Mean   : 2.9399  
##  3rd Qu.: 21206   3rd Qu.:  813816   3rd Qu.: 219345   3rd Qu.: 4.7735  
##  Max.   :727548   Max.   :13492812   Max.   :6904824   Max.   : 8.5860  
##  NA's   :1                                             NA's   :1        
## 
##      RENFIN            LIQUIDEZ          MARGEN            SOLVE       
##  Min.   :-359.773   Min.   :0.0780   Min.   :-302.03   Min.   :-40.74  
##  1st Qu.:   1.664   1st Qu.:0.7342   1st Qu.:  12.39   1st Qu.: 11.26  
##  Median :  10.812   Median :1.2345   Median :  21.42   Median : 23.68  
##  Mean   :  -3.450   Mean   :1.4200   Mean   :  16.40   Mean   : 32.68  
##  3rd Qu.:  25.312   3rd Qu.:1.5615   3rd Qu.:  38.56   3rd Qu.: 52.62  
##  Max.   :  52.261   Max.   :5.3300   Max.   : 208.36   Max.   : 99.08  
## 
##     APALANCA            RATIO          
##  Min.   :-6265.50   Min.   :-0.029752  
##  1st Qu.:   16.13   1st Qu.: 0.009852  
##  Median :  145.93   Median : 0.021840  
##  Mean   :  -17.17   Mean   : 0.022180  
##  3rd Qu.:  504.74   3rd Qu.: 0.035305  
##  Max.   : 1019.62   Max.   : 0.064395  
##                     NA's   :1

En la transformación de variables mediante la función mutate(), se pueden utilizar funciones integradas en otros paquetes de R. Por ejemplo, si queremos calcular la variable ACTIVOS_ACUM como la variable que recoge los activos acumulados de las empresas, comenzando por la empresa con menor activo, podríamos utilizar la función cumsum() del paquete {base}, y hacer:

eolica_20 <- arrange(eolica_20, ACTIVO)
eolica_20 <- mutate (eolica_20, ACTIVOS_ACUM = cumsum(ACTIVO))
select(eolica_20, ACTIVO, ACTIVOS_ACUM)
##                                     ACTIVO ACTIVOS_ACUM
## WPD Wind Investment SL.           109023.8     109023.8
## Parque Eolico Santa Catalina SL   147742.5     256766.3
## Eolica La Janda SL                153429.4     410195.8
## Esquilvent SL                     157630.6     567826.4
## Biovent Energia SA                183899.0     751725.4
## Acciona Eolica Del Levante SL     188354.0     940079.4
## Guzman Energia SL                 190287.0    1130366.4
## Innogy Spain SA.                  230338.5    1360704.9
## Al-Andalus Wind Power SL          249853.8    1610558.7
## Viesgo Renovables SL.             269730.0    1880288.7
## Naturgy Wind, S.L.                273542.0    2153830.7
## Parque Eolico La Boga SL.         303904.4    2457735.1
## Olivento SL                       381207.0    2838942.0
## Elawan Energy SL.                 443467.0    3282409.0
## Saeta Yield SA.                   796886.4    4079295.4
## Corporacion Acciona Eolica SL     864606.0    4943901.4
## EDP Renovables España SLU        1275939.0    6219840.4
## Naturgy Renovables SLU           1956869.0    8176709.4
## Global Power Generation SA.      2002458.0   10179167.4
## Holding De Negocios De GAS SL.  13492812.0   23671979.4

Podemos verificar cómo se ha integrado en el data frame la variable ACTIVOS_ACUM.

Un último ejemplo de adición de una variable que es transformación de otras. En este caso, crearemos la variable TAM (tamaño), que es categórica (los datos son conjuntos de carcteres). Esta variable toma valor “G” para las empresas con un valor de la variable ACTIVO mayor que 1.000.000, y “P” para las que tengan un valor en la variable ACTIVO menor o igual a 1.000.000. Para calcular automáticamente esta nueva variable categórica, utilizaremos la función de {base} cut(). De este modo, haremos:

eolica_20 <- mutate(eolica_20, TAM = cut(ACTIVO,
  breaks = c(-Inf, 1000000, Inf), labels = c("P", "G")))
select(eolica_20, ACTIVO, TAM)
##                                     ACTIVO TAM
## WPD Wind Investment SL.           109023.8   P
## Parque Eolico Santa Catalina SL   147742.5   P
## Eolica La Janda SL                153429.4   P
## Esquilvent SL                     157630.6   P
## Biovent Energia SA                183899.0   P
## Acciona Eolica Del Levante SL     188354.0   P
## Guzman Energia SL                 190287.0   P
## Innogy Spain SA.                  230338.5   P
## Al-Andalus Wind Power SL          249853.8   P
## Viesgo Renovables SL.             269730.0   P
## Naturgy Wind, S.L.                273542.0   P
## Parque Eolico La Boga SL.         303904.4   P
## Olivento SL                       381207.0   P
## Elawan Energy SL.                 443467.0   P
## Saeta Yield SA.                   796886.4   P
## Corporacion Acciona Eolica SL     864606.0   P
## EDP Renovables España SLU        1275939.0   G
## Naturgy Renovables SLU           1956869.0   G
## Global Power Generation SA.      2002458.0   G
## Holding De Negocios De GAS SL.  13492812.0   G

Podemos advertir cómo la función cut(), que incluimos dentro de nuestra función de {dplyr} mutate(), tiene, a su vez, varios argumentos: la variable numérica de referencia (ACTIVO); el argumento “breaks”, en el que decimos los intervalos en que quedarán divididos los casos (uno, de menos infinito a 1.000.000; y otro de 1.000.000 a más infinito), y “labels”, que es el valor que tomará la variable creada (TAM) según el intervalo en el que se sitúe cada caso de la muestra.

Cabe destacar que podíamos haber escrito el código para crear la variable TAM de un modo más elegante y cómodo, utilizando el operador pipe (%>%). Este operador permite concatenar una serie de instrucciones:

eolica_20 <- eolica_20 %>% mutate(TAM = cut(ACTIVO,
  breaks = c(-Inf, 1000000, Inf), labels = c("P", "G")))
select(eolica_20, ACTIVO, TAM)
##                                     ACTIVO TAM
## WPD Wind Investment SL.           109023.8   P
## Parque Eolico Santa Catalina SL   147742.5   P
## Eolica La Janda SL                153429.4   P
## Esquilvent SL                     157630.6   P
## Biovent Energia SA                183899.0   P
## Acciona Eolica Del Levante SL     188354.0   P
## Guzman Energia SL                 190287.0   P
## Innogy Spain SA.                  230338.5   P
## Al-Andalus Wind Power SL          249853.8   P
## Viesgo Renovables SL.             269730.0   P
## Naturgy Wind, S.L.                273542.0   P
## Parque Eolico La Boga SL.         303904.4   P
## Olivento SL                       381207.0   P
## Elawan Energy SL.                 443467.0   P
## Saeta Yield SA.                   796886.4   P
## Corporacion Acciona Eolica SL     864606.0   P
## EDP Renovables España SLU        1275939.0   G
## Naturgy Renovables SLU           1956869.0   G
## Global Power Generation SA.      2002458.0   G
## Holding De Negocios De GAS SL.  13492812.0   G

Podríamos interpretar la línea de código así: “asigna al data frame”eolica_20” sus propios datos, después (%>%) crea la variable TAM con la función cut() y añádela a “eolica_20”.

2.3.7 Extrayendo y sintetizando información de las variables de un data frame.

Otra posibilidad que permite {dplyr} es extraer y sintetizar la información de las variables contenidas en un data frame. Para ello, nos ayudaremos de la función summarise(). Como ejemplo, calculemos la rentabilidad financiera media de las 20 empresas:

#Extrayendo información de las variables de un data frame
summarise(eolica_20, RENFIN_media = mean(RENFIN)) 
##   RENFIN_media
## 1     -3.45005

A veces, es de gran utilidad combinar summarise() con group_by(), que extrae la información por grupos definidos por una de las variables. Para ilustrarlo, vamos a utilizar la variable recién creada TAM, para hacer dos grupos de empresas: las de menor (“P”) y las de mayor (“G”) volumen de activo; tras lo cual calcularemos la media de las rentabilidades para cada grupo:

eolica_20 %>%  group_by(TAM) %>% summarise(RENFIN_media = mean(RENFIN))
## # A tibble: 2 × 2
##   TAM   RENFIN_media
##   <fct>        <dbl>
## 1 P            -6.52
## 2 G             8.82

Hemos utilizado el operador pipe (%>%) para concatenar diferentes instrucciones de {dplyr}: primero agrupar casos, y luego calcular las medias de cada grupo. Es decir, en este caso se podría “traducir” la línea de código como: “Toma el data frame”eolica_9”, divide los casos en grupos según el valor de la variable TAM, y para cada grupo calcula la media de la variable RENFIN”.

2.4 Exportando datos.

Antes de concluir el capítulo, vamos a tratar brevemente el aspecto de la exportación de datos.

R cuenta con un formato propio de datos, que se traduce en archivos de extensión “RData”, y que puede incluir cualquier objeto de R. Como ejemplo, en el siguiente script, llamado “explora_exporta.R” (obtener aquí), vamos a importar los datos del archivo de Microsoft (R) Excel (R) “eolica_20.xlsx”, y el data frame donde almacenemos los datos vamos a exportarlo como el archivo de datos de R “eolica_20.RData”. Posteriormente, borraremos el data frame del Environment y recuperaremos los datos cargando ese archivo “eolica_20.RData”. Por supuesto, seguimos trabajando, como en todo el capítulo, en el proyecto “explora”.

Tras abrir el script “explora_exporta.R”, las primeras líneas de código que veremos serán las que ya hemos estudiado para borrar el contenido del Environment, importar los datos de la hoja “Top 20” del archivo “eolica_20.xlsx” (situado en nuestra carpeta de proyecto), y tratar la variable “NOMBRE” para transformarla en el conjunto de nombres de las filas:

# Exportando datos de empresas eolicas (disculpad la falta de tildes)

rm(list = ls())

# DATOS

library(readxl)
eolica_20 <- read_excel("eolica_20.xlsx", sheet = "Top 20")
eolica_20 <- data.frame(eolica_20, row.names = 1)
summary(eolica_20)
##       RES             ACTIVO             FPIOS             RENECO       
##  Min.   : -5662   Min.   :  109024   Min.   : -77533   Min.   :-2.8130  
##  1st Qu.:  2865   1st Qu.:  187240   1st Qu.:  27615   1st Qu.: 0.8765  
##  Median :  7388   Median :  271636   Median :  77740   Median : 3.6150  
##  Mean   : 50754   Mean   : 1183599   Mean   : 563678   Mean   : 2.9399  
##  3rd Qu.: 21206   3rd Qu.:  813816   3rd Qu.: 219345   3rd Qu.: 4.7735  
##  Max.   :727548   Max.   :13492812   Max.   :6904824   Max.   : 8.5860  
##  NA's   :1                                             NA's   :1        
## 
##      RENFIN            LIQUIDEZ          MARGEN          SOLVENCIA     
##  Min.   :-359.773   Min.   :0.0780   Min.   :-302.03   Min.   :-40.74  
##  1st Qu.:   1.664   1st Qu.:0.7342   1st Qu.:  12.39   1st Qu.: 11.26  
##  Median :  10.812   Median :1.2345   Median :  21.42   Median : 23.68  
##  Mean   :  -3.450   Mean   :1.4200   Mean   :  16.40   Mean   : 32.68  
##  3rd Qu.:  25.312   3rd Qu.:1.5615   3rd Qu.:  38.56   3rd Qu.: 52.62  
##  Max.   :  52.261   Max.   :5.3300   Max.   : 208.36   Max.   : 99.08  
## 
##     APALANCA           MATRIZ         
##  Min.   :-6265.50   Length:20         
##  1st Qu.:   16.13   Class :character  
##  Median :  145.93   Mode  :character  
##  Mean   :  -17.17                     
##  3rd Qu.:  504.74                     
##  Max.   : 1019.62

Posteriormente, se exportará el data frame “eolica_20” al archivo de formato R, “eolica_20.RData”, mediante la función save:

# Exportando data frame a formato R (.RData)

save(eolica_20, file = "eolica_20.RData")

Puede comprobarse cómo se ha generado el archivo correspondiente en la carpeta de proyecto. Para comprobar que la exportación es correcta, vamos a borrar del Environment el data frame “eolica_20”. Después, cargaremos el archivo “eolica_20.RData”. Como resultado, podremos comprobar que tenemos un nuevo data frame “eolica_20” que es exactamente igual al que teníamos al principio:

# Borrando el data frame eolica_20

rm(eolica_20)

# Importando el archivo .RData con los mismos datos

load("eolica_20.RData")
summary (eolica_20)
##       RES             ACTIVO             FPIOS             RENECO       
##  Min.   : -5662   Min.   :  109024   Min.   : -77533   Min.   :-2.8130  
##  1st Qu.:  2865   1st Qu.:  187240   1st Qu.:  27615   1st Qu.: 0.8765  
##  Median :  7388   Median :  271636   Median :  77740   Median : 3.6150  
##  Mean   : 50754   Mean   : 1183599   Mean   : 563678   Mean   : 2.9399  
##  3rd Qu.: 21206   3rd Qu.:  813816   3rd Qu.: 219345   3rd Qu.: 4.7735  
##  Max.   :727548   Max.   :13492812   Max.   :6904824   Max.   : 8.5860  
##  NA's   :1                                             NA's   :1        
## 
##      RENFIN            LIQUIDEZ          MARGEN          SOLVENCIA     
##  Min.   :-359.773   Min.   :0.0780   Min.   :-302.03   Min.   :-40.74  
##  1st Qu.:   1.664   1st Qu.:0.7342   1st Qu.:  12.39   1st Qu.: 11.26  
##  Median :  10.812   Median :1.2345   Median :  21.42   Median : 23.68  
##  Mean   :  -3.450   Mean   :1.4200   Mean   :  16.40   Mean   : 32.68  
##  3rd Qu.:  25.312   3rd Qu.:1.5615   3rd Qu.:  38.56   3rd Qu.: 52.62  
##  Max.   :  52.261   Max.   :5.3300   Max.   : 208.36   Max.   : 99.08  
## 
##     APALANCA           MATRIZ         
##  Min.   :-6265.50   Length:20         
##  1st Qu.:   16.13   Class :character  
##  Median :  145.93   Mode  :character  
##  Mean   :  -17.17                     
##  3rd Qu.:  504.74                     
##  Max.   : 1019.62

Por supuesto, hay más formatos en los que se pueden exportar datos desde R. Por ejemplo, a un archivo de Microsoft (R) Excel (R). Un modo de hacerlo es haciendo uso de la función write_xlsx() del paquete {writexl}. Para que en la hoja de cálculo resultante se incluyan los nombres de las filas (empresas eólicas), hemos tenido previamente que crear un vector con el nombre de estas (vector “NOMBRE”), mediante la función row.names(), y unir ese vector al data frame “eolica_20”, a modo de primera columna, creando un nuevo finalmente un data frame llamado “eolica_20n”, para lo que se ha utilizado la función cbind(), que permite pegar columnas de datos que tengan un mismo número de filas.

Como resultado de todo el código, se ha obtenido el archivo de Microsoft (R) Excel (R) “eolica_20_new.xlsx”:

# Exportando el data frame eolica_20 a Microsoft Excel

library(writexl)
NOMBRE <- row.names(eolica_20)
eolica_20n <- cbind(NOMBRE, eolica_20)
write_xlsx(eolica_20n, path = "eolica_20_new.xlsx")

#Fin del script

2.5 Materiales para realizar las prácticas del capítulo.

En esta sección se muestran los links de acceso a los diferentes materiales (scripts, datos…) necesarios para llevar a cabo los contenidos prácticos del capítulo.

Datos (en formato Microsoft (R) Excel (R)):

Scripts:

Bibliografía

Wickham, Hadley, and Garrett Grolemund. 2017. R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. 1st ed. Paperback; O’Reilly Media. http://r4ds.had.co.nz/.