Clase 2 Tidy Data y manipulación de datos

Derek Corcoran
"09/10, 2017"

Estructura de datos

  • Vector: Un conjunto lineal de datos (secuencia génica, serie de tiempo)
  • Matrix: Una tabla con solo números
  • Data Frame: Una tabla donde cada columna tiene un tipo de datos (estándar dorado)
  • List: Aqui podemos meter lo que queramos

data

Vector

  • Secuencia lineal de datos
  • Pueden ser de muchos tipos (numéricos, de carácteres, lógicos, etc.)
  • Ejemplo data(uspop)
  • para crear uno c(1,4,6,7,8)
  • para subsetear un vector se pone el índice entre []
  • uspop[4], uspop[2:10], uspop[c(3,5,8)]

Vector

Data Frame

  • Una tabla, cada columna un tipo de datos (Numérico, lógico, etc)
  • Cada columna un vector
  • Ejemplo data(iris)
  • Para subsetear data.frame[filas,columnas]
  • Ejemplos iris[,3], iris[,“Petal.Length”], iris[2:5,c(1,5)], iris$Petal.Length

DataFrame

Tidy Data

Tidy

  • Cada columna una variable
  • Cada fila una observación

untidy data

plot of chunk unnamed-chunk-1

untidy data

unTidy

Un tipo especial de untidy data

  • Tablas de contingencia
  • Ejemplo data(HairEyeColor)
  • como limpiarlo paquete epitools función expand.table
data("HairEyeColor")
HairEyeColor[,,1]
       Eye
Hair    Brown Blue Hazel Green
  Black    32   11    10     3
  Brown    53   50    25    15
  Red      10   10     7     7
  Blond     3   30     5     8
library(epitools)
library(knitr)
H <- expand.table(HairEyeColor)
kable(head(H))
Hair Eye Sex
Black Brown Male
Black Brown Male
Black Brown Male
Black Brown Male
Black Brown Male
Black Brown Male

prueba de la limpieza

  • Generando modelos lineales usando lm/glm
  • Formato lm(y ~ x1 + x2 + … + xn, data = Data.frame)
data(iris)
model1 <- lm(Petal.Length ~ Species, data = iris)
library(stargazer)
stargazer(model1, type = "html", single.row=TRUE)
Dependent variable:
Petal.Length
Speciesversicolor2.798*** (0.086)
Speciesvirginica4.090*** (0.086)
Constant1.462*** (0.061)
Observations150
R20.941
Adjusted R20.941
Residual Std. Error0.430 (df = 147)
F Statistic1,180.161*** (df = 2; 147)
Note:*p<0.1; **p<0.05; ***p<0.01

dplyr

Paquete con pocas funciones muy poderosas

  • summarize
  • group_by
  • filter
  • select junto a starts_with o ends_with
  • %>% pipeline

summarize y group_by

  • summarize resume una variable
  • Group_by reune observaciones según una variable
  • Usadas en conjunto muy poderosas
library(dplyr)
library(knitr)
MEAN <- summarize(iris, MEAN.PETAL = mean(Petal.Length))
kable(MEAN)
MEAN.PETAL
3.758

summarize y group_by (continuado)

library(dplyr)
library(knitr)
MEAN <- group_by(iris, Species)
MEAN <- summarize(MEAN, MEAN.PETAL = mean(Petal.Length))
kable(MEAN)
Species MEAN.PETAL
setosa 1.462
versicolor 4.260
virginica 5.552

Pipeline (%>%)

  • Ahorra líneas, se parte con un data.frame
  • Se agregan funciones de dplyr hasta llegar al resultado deseado
library(dplyr)
library(knitr)
MEAN <- iris %>% group_by(Species) %>% summarize(MEAN.PETAL = mean(Petal.Length))
kable(MEAN)
Species MEAN.PETAL
setosa 1.462
versicolor 4.260
virginica 5.552

Pipeline (%>%) otro ejemplo

library(dplyr)
library(knitr)
MEAN <- iris %>% group_by(Species) %>% summarize_all(mean)
kable(MEAN)
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa 5.006 3.428 1.462 0.246
versicolor 5.936 2.770 4.260 1.326
virginica 6.588 2.974 5.552 2.026

Filter

  • Selecciona según una o más variables
simbolo significado simbolo_cont significado_cont
< Mayor que != distinto a
> Menor que %in% dentro del grupo
== Igual a is.na es NA
>= mayor o igual a !is.na no es NA
<= menor o igual a | & o, y

Ejemplos de filter agregando a lo anterior

library(dplyr)
data("iris")
DF <- iris %>% filter(Species != "versicolor") %>% group_by(Species) %>% summarise_all(mean)
kable(DF)
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa 5.006 3.428 1.462 0.246
virginica 6.588 2.974 5.552 2.026

Select

  • Selecciona columnas dentro de un data.frame
library(dplyr)
library(knitr)
data(nasa)
Nasa2 <- as.data.frame(nasa)
Temp <- Nasa2 %>% filter(year != 1995) %>% group_by(year) %>% select(contains("temp")) %>% summarize_all(mean)
kable(Temp)
year surftemp temperature
1996 295.8562 297.1005
1997 296.7291 297.9566
1998 297.1221 298.7028
1999 295.6850 298.1364
2000 295.7263 298.3358

Ejercicios

  • Usando la base de datos storm del paquete dplyr, calcula la velocidad promedio y diámetro promedio (hu_diameter) de las tormentas declaradas huracanes por año
    • solución:
    • storms %>% filter(status == “hurricane”) %>% select(year, wind, hu_diameter) %>% group_by(year) %>% summarize_all(mean)
  • Usando la base de datos iris crea un inline code que diga cuál es la media del largo del pétalo de la especie Iris virginica
    • solución:
    • la media para I. virginica es 5.552

Ejercicios 2

  • Crear dos modelos lineales para la base de datos mtcars uno para autos de cambios automáticos y uno para autos de cambios manuales basados en el peso del automóvil
    • Manuales <- filter(mtcars, am == 1)
    • Auto <- filter(mtcars, am == 0)
    • ManualLM <- lm(mpg ~ wt, data = Manuales)
    • AutoLM <- lm(mpg ~ wt, data = Auto)

Resultado

library(stargazer)
Manuales <- filter(mtcars, am == 1)
Auto <- filter(mtcars, am == 0)
ManualLM <- lm(mpg ~ wt, data = Manuales)
AutoLM <- lm(mpg ~ wt, data = Auto)
stargazer(ManualLM, AutoLM, type = "html", single.row=TRUE)
Dependent variable:
mpg
(1)(2)
wt-9.084*** (1.257)-3.786*** (0.767)
Constant46.294*** (3.120)31.416*** (2.947)
Observations1319
R20.8260.589
Adjusted R20.8100.565
Residual Std. Error2.686 (df = 11)2.528 (df = 17)
F Statistic52.264*** (df = 1; 11)24.392*** (df = 1; 17)
Note:*p<0.1; **p<0.05; ***p<0.01

Meta del día de hoy

Piensen en una pregunta a resolver con sus datos