class: inverse, center, middle
```{r xaringan-themer, include=FALSE, warning=FALSE}
library(xaringanthemer)
style_duo_accent(primary_color = "#4F94FF", secondary_color = "#9FE298",
                 background_color = "#f8f7f3",
                 header_font_google = google_font("Archivo"),
                 text_font_google   = google_font("Inconsolata"), 
                 link_color="#F8B057"

)
```


#Introducción a bases de datos

---
## Recapitulación
<br>

- El universo R

- Primeros pasos en R

---

## Hoy hablaremos de ...

- Bases de datos en R

- Listas

- Manipulación de datos

- Funciones basales

- Visualización

---

class: fullscreen, left, middle, text-black
background-image: url("images/typewriter.jpg")

.huge[#Data]
.huge[#frames]

---

## Dataframes (bases de datos)


- Dataframes es la forma convencional en que almacenamos datos en `R`. 

- A diferencia de otros softwares estadísticos (e.g, `SPSS`, `SAS`,`Stata`), en `R` las bases de dato son un tipo de estructura de datos, entre muchos otros.

--

  - Un dataframe es una matriz donde cada fila es una "observación y cada columna es un "variable". 

--

  - En un dataframe cada elemento (o "variable") debe tener la misma longitud (mismo número de "observaciones").

--

  - A diferencia de una matriz, un dataframe puede abarcar cualquier mezcla de tipos de datos. 

--

  - Una gran ventaja de `R` es que permite trabajar simultáneamente con más de una base de datos (además de cualquier otro tipo de objeto).

---

## Data frames (bases de datos)

Asi se ve un dataframe en `R`:
```{r, message=FALSE, warning=FALSE, echo=FALSE}
head(iris,20) 
```

---

## Construir un data frame

Un data frame requiere que los vectores sean de misma dimensión, pero no necesariamente del mismo tipo.

.top-code[
```{r dataframe, eval=FALSE}
mydf <- data.frame(x=rep(c("A","B","C"),2),
                   y=sample(1:10,size=6), 
                   z=factor(sample(letters,size=6)))
head(mydf)
```
]

--
.pull-bottom[
```{r dataframe-out, ref.label="dataframe", echo=FALSE}
```
]

---

## Construir un data frame a partir de una matriz 

Una matriz es una colección de vectores de la misma dimensión. Una base de datos es una matriz que permite diferentes tipos de datos (no sólo numéricos). 

```{r}
# vectores
v1 <- sample(1:100,10)
v2 <- sample(letters,10)

# matriz a partir de vectores
mymatrix <- cbind(v1,v2)

# transformar una matriz en una base de datos
mydataframe <- as.data.frame(mymatrix) 
```

--

.pull-left[
```{r, echo=FALSE}
print(mymatrix)
```
]

--

.pull-right[
```{r, echo=FALSE}
print(mydataframe)
```
]

---

## Dar nombre a columnas y filas

```{r}
# asigna nombre a columnas (en order)
colnames(mydf) <- c("group_string","outcome_numeric","letters_factor") 
names(mydf)

# asigna nombre a filas: rownames(mydf)  
```
--
```{r, echo=FALSE}
head(mydf)
```

---


## Cargar y guardar data frames desde un arhivo

`R` funciona bien con archivos `.xls` y `.csv`, entre muchos otros. Muchos paquetes permiten la importación de otros formatos de datos (e.g., archivos `.dta`).

**Cargando datos**

```r
setwd("ubicación de mi archivo")
mydata <- read.csv('filename.csv', header=T)
```

**Guardando datos**

```r
setwd("ubicación donde quiero guarda mi archivo")
write.csv(mydata, 'filename.csv')
```
---

## Cargar y guardar data frames desde un paquete

Muchos paquetes de `R` incluyen data frames. Más aún, muchos paquetes de `R` son principalmente colecciones de datos (e.g., `datasets`,`essurvey`,`countyweather`. `carData`). Cargamos el paquete `datasets`.

```{r}
library("datasets")
```

Escribiendo `datasets::` en la consola de `RStudio` el auto-completador mostrará la lista de bases de datos disponibles, con una breve descripción. `datasets::morley`, por ejemplo, contiene datos sobre una serie de experimentos conducidos en 1879 para medir la velocidad de la luz. 

```{r}
data(morley) # carga datos en la memoria
speed_of_light <- morley # asigna datos a un objeto de R
head(speed_of_light)
```
---

## Listas

Una lista es una colección arbitraria de objetos. Los elemento de una lista no tienen que ser del mismo tipo ni tener las mismas dimensiones.

```{r}
mylist <- list(year=1879, name="Michelson Speed of Light Data", data=head(speed_of_light)); mylist
```
---

## Acceder a elementos de una lista

Utilizamos doble corchete para acceder a cada elemento, o el operador `$`.
```{r}
mylist[[1]]
mylist$data[1:2,2:3]
```

---

class: fullscreen,left, middle, text-black
background-image: url("images/typewriter.jpg")

.huge[#Mani]
.huge[#pulación]
.huge[#de]
.huge[#datos]


---

## Datos del plesbiscito de 1989 en Chile. 

En el paquete `carData` se encuentra una base de datos llamada "Chile". Esta base contiene datos de una encuenta realizada por FLACSO/Chile en Abril y Mayo de 1988 sobre intención de voto en el plesbiscito de 1989, junto con otras variables socio-demográficas.    

.pull-left[
En lo que sigue vamos a usar esta base de datos para ejemplificar diferentes herramientas para la manipulación de datos en `R`.
]

.pull-right[
![NO](images/franja_NO.jpg)
]

---

## Dimensiones 

Para inspeccionar rapidamente una base de datos podemos usar las funciones `head()` and `tail()`. 

```{r}
# Cargamos los datos de Chile
library("carData")
data("Chile") # datos "flotante"
data_chile <- Chile; # crea dataframe
rm(Chile) # remueve "flotante"
head(data_chile) # muestra 6 primeras observaciones
```

--

Para saber las dimensiones de una matriz o data frame (*rows*, *cols*) usamos la función `dim()`.
```{r}
dim(data_chile)
```

---

## Seleccionar filas y columnas

Filas y columnas se seleccionan usando corchetes cuadrados para "indexar" la posición que se quiere seleccionar. Por ejemplo, `data_chile[3,8]` corresponde a observación 3, variable 8:

```{r row-col}
data_chile[3,8]
```
<br>
--

Seleccionar una fila/columna entera dejando posición en blanco: 
.pull-left[
```{r, eval=FALSE}
# todas las columnas de la fila 4
head(data_chile[4,])
```
]

.pull-right[
```{r, eval=FALSE}
# todas las filas de la columna 6
head(data_chile[,6]) 
```
]

---

## Más formas de seleccionar filas y columnas

```r
data_chile[-1,]                   # excluye primera fila
data_chile[, -(2:4)]              # excluye columnas 2 a 4
data_chile[, c("income","vote")]  # solo vars income and vote
data_chile[c(1,5),'vote']         # variable voto para observaciones 1 y 5
data_chile$vote                  # selecciona col vote
```

--

Ejemplo:

```{r}
dim(data_chile[-1,c("income","vote")]) # dimesion
nrow(data_chile[-1,c("income","vote")]) # número de filas
ncol(data_chile[-1,c("income","vote")]) # número de columnas
```

---

## Filtro de datos

¿Y si sólo nos interesa una sub-muestra de votantes jóvenes que apoyan la opción SI?

--


```{r}
jovenes_pinochetistas <- data_chile[data_chile$age <= 35 & data_chile$vote=="Y",]
head(jovenes_pinochetistas,15)
```

---
## Creación de nuevas variables y recodificación

Para crear una nueva variable debemos asignarla al dataframe usando el operado `$`.

```{r}
data_chile$year <- 1988
```

<br>
--

Podemos crear nuevas variables transformando y combinando variables ya existente. Aquí crearemos una variable que calcula el año de nacimiento de los entrevistados:

```{r}
data_chile$birthyear <- data_chile$year -  data_chile$age
```

--

```{r}
head(data_chile$birthyear)
```

---

## Creación de nuevas variables y recodificación

También podemos crear nuevas variables en base a valores de variables existente. Aquí crearemos una variable de grupos de edad.

```{r}
data_chile$age_group <- NA
data_chile$age_group[data_chile$age <=35] <- "Young"
data_chile$age_group[data_chile$age > 35] <- "Old"
```
--

```{r}
head(data_chile$age_group) 
```

<br>
--

Detrás de la asignación condicional de valores hay una evaluación lógica.
```{r}
head(data_chile$age <= 35) 
```

---

## Manipulación de valores perdidos

En un data frame los valores perdidos aparecen como `NA`s. `NA`s son un tipo de dato.
.left-code[
```{r missing, eval=FALSE}
  x <- c(1, NA, 2, 7, 8)
  y <- c(NA, 1, 4, 7, 2)
  df <- cbind(x, y)
  
  is.na(x) #<< 
  x[!is.na(x)] #<< 
  df[complete.cases(df),] #<<
```
]
.pull-right[
```{r missing-out, ref.label="missing", echo=FALSE}
```
]

---

## Manipulación de valores perdidos

Aplicado a los datos chilenos

```{r}
# datos como vienen
dim(data_chile)

# cuenta no NA para una variable
sum(!is.na(data_chile$vote))

# datos completos
dim(data_chile[complete.cases(data_chile),])
```

---

class: fullscreen,left, middle, text-black
background-image: url("images/typewriter.jpg")

.huge[#Fun]
.huge[#ciones]
.huge[#basales]

---

## Resumen

Resumen de datos o prácticamente cualquier objeto con la función `summary(x)`.

```{r summary, width=60}
summary(data_chile[,c("age","income","vote")])
```

---

## Estructura 

Una mirada rápida a la estructura los datos `str(x)`

```{r str}
str(data_chile)
```

---

## Atributos

Explorar el contenido de un objecto `attributes(x)`

```{r attribute}
attributes(data_chile[1:10,1:5])
```

---

## Tablas de contingencia 

Tabulación rápica `table(x,y)`
       
.pull-left[
```{r}
mytable <- 
table(data_chile$sex, data_chile$vote)
mytable
```
]
.pull-right[
```{r}
round(prop.table(mytable,margin=2),2)
```
]

<br>

La function `prop.table` transforma una tabla de frecuencias en una tabla de proporciones.

---

## Funciones básicas para vectores y variables

```r
sum()    # suma elementos
mean()   # promedio
sd()     # desviación estándar
max()    # máximo
which.max() # posición de valor máximo 
min()    # mínimo
which.min() # posición de valor mínimo 
rank()   # ranking de valores
median() # mediana
range()  # rango
rev()    # revertir elementos
unique() # lista de elementos únicos
length() # largo
```
Ejemplo,
.pull-left[
```{r}
mean(data_chile$income)
```
]

.pull-right[
```{r}
mean(data_chile$income, na.rm = TRUE)
```
]

---

class: fullscreen,left, middle, text-black
background-image: url("images/typewriter.jpg")

.huge[#Loops]

---

## `for` loops

Idea: cualquier repetición manual puede ser automatizada

--

.pull-left[
con números

```{r}
for(i in 1:10){
  root2 =  sqrt(i)
  print(root2)
}
```
]

--


.pull-right[
con números + almacenamiento
```{r}
mynumbers <- matrix(NA, nrow= 10,ncol = 2)

for(i in 1:10){
  root2 =  sqrt(i)
  mynumbers[i,1] <- i
  mynumbers[i,2] <- root2
}
print(mynumbers)
```
]

---

## `for` loops

con strings

```{r}

list_words <- c("a","b","c","d")

z <- NULL
for (i in list_words) {
  x <- paste(i,"!!", sep="")
  z <- c(z,x)
}    
print(z)
```


---

## Una aplicaciónes de loops al trabajo con bases de datos


.lef-top[
```{r loop, eval=FALSE}
incomes <- sort(unique(Chile$income))

results <- NULL

for (i in incomes) {
  subsample <- Chile[Chile$income==i,]
  props <- prop.table(table(subsample$vote))["N"]
  results <- c(results,props)
}

print(incomes)
print(results) 
```
]

--
.pull-bottom[
```{r loop-out, ref.label="loop", echo=FALSE}
```
]

---

class: fullscreen,left, middle, text-black
background-image: url("images/typewriter.jpg")

.huge[#Visual]
.huge[#ización]

---

## Scatterplots
.pull-left[
```{r points, fig.show = 'hide', fig.retina = 3}
plot(log(incomes), results, 
     xlab="log(ingresos)", 
     ylab="% voto NO",
     type="p",  
     pch=16, 
     ylim = c(0.25,0.45), 
     col="red")
```
]

--

.pull-right[
```{r ref.label = 'points', echo = FALSE}
```
]

---

## Lineas
.pull-left[
```{r lines, fig.show = 'hide', fig.retina = 3}
plot(log(incomes), results, 
     xlab="log(ingresos)", 
     ylab="% voto NO", 
     type="l", #<<
     ylim = c(0.25,0.45), col="red")
```
]

--

.pull-right[
```{r ref.label = 'lines', echo = FALSE}
```
]

---
## Lineas y puntos
.pull-left[
```{r lines_dots, fig.show = 'hide', fig.retina = 3}
plot(log(incomes), results, 
     xlab="log(ingresos)", 
     ylab="% voto NO", 
     type="l", #<<
     ylim = c(0.25,0.45), col="red")

points(log(incomes), results, #<<
       col="blue", pch=16) #<<
```
]

--

.pull-right[
```{r ref.label = 'lines_dots', echo = FALSE}
```
]
---

## Histogramas

.pull-left[
```{r hist, fig.show = 'hide', fig.retina = 3}
par(mar=c(5,4,1,1), bg='white')
hist(Chile$income, main="", 
     xlab="Income",
     col="orange")
```
]

--

.pull-right[
```{r ref.label = "hist", echo = FALSE}
```
]

---

## Bar plots

.pull-left[
```{r bar, fig.show = 'hide', fig.retina = 3}
barplot(table(Chile$education),
        ylim = c(0,2000),
    col="purple")

box() #<<
```
]

--

.pull-right[
```{r ref.label = "bar", echo = FALSE}
```
]

---

## En la próxima clase ... 

- Taller #1: primer acercamiento a bases de datos en R (CASEN 2017)

---

class: fullscreen,left, top, top, text-azzurro
background-image: url("images/bicicleta.jpg")

.huge[#R se aprende]
.huge[#usando y]
.huge[#preguntando]

---

![](images/stack-exchange-search.png)

---
class: inverse, center, middle

#Hasta la próxima clase
##Gracias!


<br>
Mauricio Bucca <br>
https://mebucca.github.io/ <br>
github.com/mebucca






