Datos de Excel

Archivos .csv

csv es un potente paquete de R. Funciona en formatos de archivo Excel con extensión .xls o xlsx. Además, sirve como una alternativa al paquete xlsx .

# install.packages("csv",dependencies=T)  instalar el paquete
 
library(csv) # cargar el paquete

Nota: es importante agregar “dependencies” al momento de instalar el paquete para que se descarguen todos los elementos que se requieren para usar el paquete en su máxima capacidad.

Antes de iniciar, recuerden que es muy importante seleccionar el directorio de trabajo

setwd("C:/Users/Administrador/Dropbox/UCARIBE/2021/CD/Trabajando con datos estructurados")  
  1. Generemos los siguientes datos:
Edad           <- c(23,30,30,35,40)
Estatura       <- c(164,170,180,155,180)
Peso           <- c(50,70,85,45,80)
Nacionalidad   <- c("Mexicano","Mexicano","Mexicano","Extranjero","Extranjero")
Genero         <- c("Mujer","Hombre","Hombre","Mujer","Hombre")
  1. Convertir la informacion en una base de datos y nombre las variables.
datos             <- data.frame(Genero,Edad,Estatura,Peso,Nacionalidad)
row.names(datos)   <- c("Ana","Alberto","María","Juan","Pedro")
  1. Posteriormente exporte los datos en un formato de tabla en Excel.
write.csv(datos,"Grupo 1.csv")
  1. Importar los datos.
Data  <- read.csv("Grupo 1.csv")
Data
##         X Genero Edad Estatura Peso Nacionalidad
## 1     Ana  Mujer   23      164   50     Mexicano
## 2 Alberto Hombre   30      170   70     Mexicano
## 3   María Hombre   30      180   85     Mexicano
## 4    Juan  Mujer   35      155   45   Extranjero
## 5   Pedro Hombre   40      180   80   Extranjero
  1. ¿Qué graficos podrías hacer para representar estos datos?
d1       <- table(Genero,Edad)

barplot(d1,col=c("blue","green"),xlab="Genero",
        legend.text=rownames(d1),beside=F)

Archivos .xls

readxl es un paquete diseñado para hacer una sola tarea: importar hojas de Excel a R. Esto hace que sea un paquete ligero y eficiente, a cambio de no contar con funciones avanzadas.

Es compatible con hojas de cálculo de Excel con extensión .xls y .xlsx. Sin embargo, no es compatible con hojas de cálculo con extensión .ods, común en paquetería de oficina de código libre como LibreOffice.

Algo importante: si una celda de una pestaña contiene una fórmula, se importa es el resultado de esa fórmula. En general, lo que ves es lo que obtienes al importar una hoja de cálculo. Si deseas recuperar información contenida en fórmulas, tendrás que buscar otras alternativas.

# install.packages("readxl",dependencies=T)   instalar el paquete
 
library(readxl) # cargar el paquete
  • Base de datos en Schoology.

Antes de empezar, necesitamos conocer el contenido de nuestra hoja de cálculo. Podemos usar la función excel_sheets para conocer qué pestañas contiene nuestra hoja de cálculo desde R.

excel_sheets("Practica.xls")
## [1] "Dimensiones" "Mujeres"     "Mediciones"

Primera pestaña: usaremos la función read_excel indicando el documento que queremos importar, sin parámetros adicionales, pues por defecto importará solo la primera pestaña.

excel_1 <- read_excel("Practica.xls")

Para explorar los datos que tenemos. Veremos su estructura (str), un resumen de su contenido (summary), y sus primeros (head) y últimos (tail) renglones.

# install.packages("dplyr")
library(dplyr)

excel_1 %>% str()
## tibble [150 x 5] (S3: tbl_df/tbl/data.frame)
##  $ Anchox: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Largox: num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Anchoy: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Largoy: num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Tipo  : num [1:150] 1 1 1 1 1 1 1 1 1 1 ...
excel_1 %>% summary()
##      Anchox          Largox          Anchoy          Largoy           Tipo  
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   Min.   :1  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   1st Qu.:1  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300   Median :2  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199   Mean   :2  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800   3rd Qu.:3  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500   Max.   :3
excel_1 %>% head()
## # A tibble: 6 x 5
##   Anchox Largox Anchoy Largoy  Tipo
##    <dbl>  <dbl>  <dbl>  <dbl> <dbl>
## 1    5.1    3.5    1.4    0.2     1
## 2    4.9    3      1.4    0.2     1
## 3    4.7    3.2    1.3    0.2     1
## 4    4.6    3.1    1.5    0.2     1
## 5    5      3.6    1.4    0.2     1
## 6    5.4    3.9    1.7    0.4     1
tail(excel_1)
## # A tibble: 6 x 5
##   Anchox Largox Anchoy Largoy  Tipo
##    <dbl>  <dbl>  <dbl>  <dbl> <dbl>
## 1    6.7    3.3    5.7    2.5     3
## 2    6.7    3      5.2    2.3     3
## 3    6.3    2.5    5      1.9     3
## 4    6.5    3      5.2    2       3
## 5    6.2    3.4    5.4    2.3     3
## 6    5.9    3      5.1    1.8     3

¿Qué graficos podrías hacer para representar estos datos?

plot(excel_1[,1:4],pch=21,col=c("red","green3", "blue")[(excel_1$Tipo)])

Segunda pestaña: usando la misma función read_excel , agregando ahora el argumento sheet.

Este argumento nos permite determinar qué pestaña queremos importar. Podemos indicar la pestaña que deseemos con un número, o podemos indicar la pestaña que deseamos con su nombre,

excel_2 <- read_excel("Practica.xls", sheet = "Mujeres")

Podemos hacer la misma exploración de la pestaña

excel_2 %>% str()
## tibble [14 x 2] (S3: tbl_df/tbl/data.frame)
##  $ 58 : num [1:14] 59 60 61 62 63 64 65 66 67 68 ...
##  $ 115: num [1:14] 117 120 123 126 129 132 135 139 142 146 ...
excel_2 %>% summary()
##        58             115       
##  Min.   :59.00   Min.   :117.0  
##  1st Qu.:62.25   1st Qu.:126.8  
##  Median :65.50   Median :137.0  
##  Mean   :65.50   Mean   :138.3  
##  3rd Qu.:68.75   3rd Qu.:149.0  
##  Max.   :72.00   Max.   :164.0
excel_2 %>% head()
## # A tibble: 6 x 2
##    `58` `115`
##   <dbl> <dbl>
## 1    59   117
## 2    60   120
## 3    61   123
## 4    62   126
## 5    63   129
## 6    64   132
excel_2 %>% tail()
## # A tibble: 6 x 2
##    `58` `115`
##   <dbl> <dbl>
## 1    67   142
## 2    68   146
## 3    69   150
## 4    70   154
## 5    71   159
## 6    72   164

Al parecer, se han importado correctamente los datos, pero con un problema. Los nombres de las columnas no son los correctos.

Esto se debe a que las columnas de esta pestaña no tienen encabezado, entonces al importarla se toman como nombres de columna los valores del primer renglón.

Podemos comprobar esto usando la función names.

names(excel_2)
## [1] "58"  "115"

Existen dos soluciones a este problema.

  1. Si no conocemos los nombres que deben tener las columnas, es usar el parámetro col_names=F. De este modo, a cada columna se le asignará como nombre de …1 hasta …2, donde n es el número de columnas que tengamos.
excel_2 <- read_excel("Practica.xls", sheet = "Mujeres", col_names = F)
## New names:
## * `` -> ...1
## * `` -> ...2
  1. Si conocemos los nombres de las columnas, es usar col_names con valor igual a un vector de texto con los nombres de las columnas. En esta pestaña, la primera columna son estaturas y la segunda son pesos, así que usaremos la segunda solución y asignaremos sus nombres.
excel_2 <- read_excel("Practica.xls",sheet = "Mujeres", 
    col_names = c("Estatura", "Peso"))

excel_2 %>% names
## [1] "Estatura" "Peso"

¿Qué graficos podrías hacer para representar estos datos?

plot(excel_2,pch=21,col="blue",type="l")

Tercera pestaña: importemos la tercera pestaña por su nombre y veamos sus primeros diez renglones usando head con el parámetro \(n = 10\).

read_excel("Practica.xls", sheet = "Mediciones")  %>% head(n=10)
## New names:
## * `` -> ...1
## * `` -> ...3
## * `` -> ...4
## * `` -> ...5
## * `` -> ...6
## * ...
## # A tibble: 10 x 9
##     ...1 `Base de datos de C~ ...3  ...4       ...5    ...6    ...7  ...8  ...9 
##    <dbl> <chr>                <chr> <chr>      <chr>   <chr>   <chr> <chr> <chr>
##  1    NA <NA>                 <NA>  <NA>       <NA>    <NA>    <NA>  <NA>  <NA> 
##  2    NA Mediciones primer s~ <NA>  <NA>       <NA>    <NA>    <NA>  <NA>  <NA> 
##  3    NA Ozono                Sol   Viento     Temper~ Observ~ Fecha Mes   Día  
##  4     1 41                   190   7.4000000~ 67      <NA>    43831 5     1    
##  5     2 36                   118   8          72      <NA>    43832 5     2    
##  6     3 12                   149   12.6       74      <NA>    43833 5     3    
##  7     4 18                   313   11.5       62      <NA>    43834 5     4    
##  8     5 NA                   NA    14.300000~ 56      <NA>    43835 5     5    
##  9     6 28                   NA    14.9       66      <NA>    43836 5     6    
## 10     7 23                   299   8.5999999~ 65      <NA>    43837 5     7

Los datos no lucen bien. Veamos su estructura y su resumen.

read_excel("Practica.xls",sheet = "Mediciones") %>% str()
## New names:
## * `` -> ...1
## * `` -> ...3
## * `` -> ...4
## * `` -> ...5
## * `` -> ...6
## * ...
## tibble [156 x 9] (S3: tbl_df/tbl/data.frame)
##  $ ...1                   : num [1:156] NA NA NA 1 2 3 4 5 6 7 ...
##  $ Base de datos de Cancún: chr [1:156] NA "Mediciones primer semestre" "Ozono" "41" ...
##  $ ...3                   : chr [1:156] NA NA "Sol" "190" ...
##  $ ...4                   : chr [1:156] NA NA "Viento" "7.4000000000000004" ...
##  $ ...5                   : chr [1:156] NA NA "Temperatura" "67" ...
##  $ ...6                   : chr [1:156] NA NA "Observaciones" NA ...
##  $ ...7                   : chr [1:156] NA NA "Fecha" "43831" ...
##  $ ...8                   : chr [1:156] NA NA "Mes" "5" ...
##  $ ...9                   : chr [1:156] NA NA "Día" "1" ...
read_excel("Practica.xls",sheet = "Mediciones") %>% summary()
## New names:
## * `` -> ...1
## * `` -> ...3
## * `` -> ...4
## * `` -> ...5
## * `` -> ...6
## * ...
##       ...1     Base de datos de Cancún     ...3               ...4          
##  Min.   :  1   Length:156              Length:156         Length:156        
##  1st Qu.: 39   Class :character        Class :character   Class :character  
##  Median : 77   Mode  :character        Mode  :character   Mode  :character  
##  Mean   : 77                                                                
##  3rd Qu.:115                                                                
##  Max.   :153                                                                
##  NA's   :3                                                                  
##      ...5               ...6               ...7               ...8          
##  Length:156         Length:156         Length:156         Length:156        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##      ...9          
##  Length:156        
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
## 

Si abrimos con Excel u otra aplicación similar la hoja de cálculo con la que estamos trabajando, nos daremos cuenta que la pestaña tiene celdas combinadas, encabezados, espacio en blanco y otros elementos que no es necesario conservar al importar a R.

Esto es algo común al trabajar con las hojas de cálculo, pues todos estos elementos suelen ser usados para mejorar la presentación de la información o para prepararla para imprimirla en papel. Desde luego, esto no representa un conjunto de datos ordenados, así que hay que hacer ajustes.

Usaremos el argumentoskip=3 para omitir la lectura de los tres primeros renglones, los cuales contienen títulos y subtítulos de la pestaña.

Sys.setenv(TZ = "America/Mexico_City")
read_excel("Practica.xls",sheet = "Mediciones", skip = 3) %>%
  head(10)
## New names:
## * `` -> ...1
## # A tibble: 10 x 9
##     ...1 Ozono Sol   Viento Temperatura Observaciones Fecha                 Mes
##    <dbl> <chr> <chr>  <dbl>       <dbl> <lgl>         <dttm>              <dbl>
##  1     1 41    190      7.4          67 NA            2020-01-01 00:00:00     5
##  2     2 36    118      8            72 NA            2020-01-02 00:00:00     5
##  3     3 12    149     12.6          74 NA            2020-01-03 00:00:00     5
##  4     4 18    313     11.5          62 NA            2020-01-04 00:00:00     5
##  5     5 NA    NA      14.3          56 NA            2020-01-05 00:00:00     5
##  6     6 28    NA      14.9          66 NA            2020-01-06 00:00:00     5
##  7     7 23    299      8.6          65 NA            2020-01-07 00:00:00     5
##  8     8 19    99      13.8          59 NA            2020-01-08 00:00:00     5
##  9     9 8     19      20.1          61 NA            2020-01-09 00:00:00     5
## 10    10 NA    194      8.6          69 NA            2020-01-10 00:00:00     5
## # ... with 1 more variable: Día <dbl>

Luce mucho mejor, pero aún tenemos problemas a resolver.

Posibles problemas:

  1. En las columnas donde hay NA para indicar valores perdidos, convierten las columnas donde tenemos números como si su contenido fuera texto.

  2. La primera columna contiene el número de renglón de las observaciones en esta hoja. Esto es redundante con el número de renglón que se ha asigna al importar a R.

  3. Tenemos columnas con nombres, pero sin contenido y algunas columnas tienen nombres mal escritos o incorrectos.

Soluciones:

  1. Usaremos el parámetro na="NA". De esta manera, indicamos que los datos perdidos se han codificado.

  2. Asignaremos al parámetro col_types un vector de texto indicando el tipo de datos que contiene cada columna. Podemos elegir entre los valores “numeric”, “text”, “date” o “blank”, usando un valor para cada columna. De este modo, elegiremos “date” para la columna fecha y “numeric” para las demás.

  3. Si deseamos que una columna sea omitida al importar una hoja, le asignamos el nombre en col_namescomo NA. Esto es lo que haremos con la primera columna y las columnas sin datos.

excel_3 <-read_excel("Practica.xls",sheet = "Mediciones", skip = 4,na="NA",
  col_types = c( "skip", "numeric", "numeric", "numeric", "numeric", "skip", "date", "numeric", "numeric"),
  col_names = c(NA,  "Ozono", "Rad_solar", "Viento", "Temp", NA, "Fecha", "Mes","Dia")
  )
excel_3 %>% head(10)
## # A tibble: 10 x 7
##    Ozono Rad_solar Viento  Temp Fecha                 Mes   Dia
##    <dbl>     <dbl>  <dbl> <dbl> <dttm>              <dbl> <dbl>
##  1    41       190    7.4    67 2020-01-01 00:00:00     5     1
##  2    36       118    8      72 2020-01-02 00:00:00     5     2
##  3    12       149   12.6    74 2020-01-03 00:00:00     5     3
##  4    18       313   11.5    62 2020-01-04 00:00:00     5     4
##  5    NA        NA   14.3    56 2020-01-05 00:00:00     5     5
##  6    28        NA   14.9    66 2020-01-06 00:00:00     5     6
##  7    23       299    8.6    65 2020-01-07 00:00:00     5     7
##  8    19        99   13.8    59 2020-01-08 00:00:00     5     8
##  9     8        19   20.1    61 2020-01-09 00:00:00     5     9
## 10    NA       194    8.6    69 2020-01-10 00:00:00     5    10
excel_3 %>% summary()
##      Ozono          Rad_solar         Viento            Temp      
##  Min.   :  1.00   Min.   :  7.0   Min.   : 1.700   Min.   :56.00  
##  1st Qu.: 18.00   1st Qu.:115.8   1st Qu.: 7.400   1st Qu.:72.00  
##  Median : 31.50   Median :205.0   Median : 9.700   Median :79.00  
##  Mean   : 42.13   Mean   :185.9   Mean   : 9.958   Mean   :77.88  
##  3rd Qu.: 63.25   3rd Qu.:258.8   3rd Qu.:11.500   3rd Qu.:85.00  
##  Max.   :168.00   Max.   :334.0   Max.   :20.700   Max.   :97.00  
##  NA's   :37       NA's   :7                                       
##      Fecha                 Mes             Dia      
##  Min.   :2020-01-01   Min.   :5.000   Min.   : 1.0  
##  1st Qu.:2020-02-08   1st Qu.:6.000   1st Qu.: 8.0  
##  Median :2020-03-17   Median :7.000   Median :16.0  
##  Mean   :2020-03-17   Mean   :6.993   Mean   :15.8  
##  3rd Qu.:2020-04-24   3rd Qu.:8.000   3rd Qu.:23.0  
##  Max.   :2020-06-01   Max.   :9.000   Max.   :31.0  
##