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")
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")
datos <- data.frame(Genero,Edad,Estatura,Peso,Nacionalidad)
row.names(datos) <- c("Ana","Alberto","María","Juan","Pedro")
write.csv(datos,"Grupo 1.csv")
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
d1 <- table(Genero,Edad)
barplot(d1,col=c("blue","green"),xlab="Genero",
legend.text=rownames(d1),beside=F)
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
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.
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
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:
En las columnas donde hay NA
para indicar valores perdidos, convierten las columnas donde tenemos números como si su contenido fuera texto.
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.
Tenemos columnas con nombres, pero sin contenido y algunas columnas tienen nombres mal escritos o incorrectos.
Soluciones:
Usaremos el parámetro na="NA"
. De esta manera, indicamos que los datos perdidos se han codificado.
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.
Si deseamos que una columna sea omitida al importar una hoja, le asignamos el nombre en col_names
como 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
##