martes, 19 de mayo de 2015

TABLAS DE FRECUENCIA II. Variables cuantitativas


# Mediante el presente documento, veremos tablas de frecuencia, a partir de variables cuantitativas.

Vemos el ejemplo, basándonos en los datos del ensayo de patatas.
Establezco el directorio de trabajo
```{r}
setwd("C:/Users/Raul Ortiz/Desktop/Proyectos R")
```
Importo los datos
```{r}
DatosPatata = read.table("Potato.csv", header=T, sep="," , dec=".")
head (DatosPatata)
```
Dejo una parte de la tabla aquí para el que quiera utilizarla a la hora de seguir el ejemplo.
















Tratamiento Variedad Peso40 Peso41a45 Peso46a60 PesoMas61 Numero40 Numero41a45 Numero46a60 NumeroMas61
Testigo Krone 380 1120 16180 2360 9 23 130 16
Testigo Krone 2000 1480 15600 2340 42 25 124 14
Testigo Krone 820 920 14840 6580 16 13 129 28
Testigo Krone 130 1120 17180 11780 3 16 125 44
Testigo Krone 1840 1240 12580 7040 22 16 101 30

Averiguamos la proporción que representa cada subcategoría de pesos, dentro de cada observación.
```{r}
DatosPesos = as.table(as.matrix(DatosPatata[, 3:6])) # Seleccionamos los datos y los guardamos como tabla
class (DatosPesos) # lo comprobamos
prop.table (DatosPesos, 1) # Averiguamos la proporción por fila, es decir, por observación.
```
Si queremos agregar esta tabla DF DatosPatatas
```{r}
PropDatosPesos = as.data.frame.matrix(prop.table (DatosPesos, 1)) # Añadimos "matrix" para que conserve la estructura.
class (PropDatosPesos)
head (PropDatosPesos)

colnames (PropDatosPesos) = paste("Prop", colnames(PropDatosPesos), sep="") # Cambiamos el nombre para que no coincida con el de las columnas del DF Datos.
head (PropDatosPesos)
DatosTotal = cbind(DatosPatata,PropDatosPesos)
head (DatosTotal)
```
Si queremos tener la información en tanto porciento
```{r}
DatosTotal = cbind(DatosPatata,PropDatosPesos*100)
head(DatosTotal)
```

lunes, 18 de mayo de 2015

TABLAS DE FRECUENCIA I. Variables cualitativas.


# Mediante el presente documento, veremos tablas de frecuencia, de contingencia o de recuento de datos.

Creamos un par de DF para usarlos en el ejemplo
```{r}
Datos = data.frame (
    Cultivo = c("Trigo", "Melocoton", "Sandia", "Tomate", "Cebada","Ciruelo","Melon", "Almendro", "Calabacin", "Maiz"),
    Grupo = c("Cereal", "Frutal", "Horticola", "Horticola", "Cereal", "Frutal", "Horticola", "Frutal", "Horticola", "Cereal"),
    Agua = c("Secano", "Regadio", "Regadio", "Regadio", "Secano", "Regadio", "Regadio", "Secano", "Regadio", "Regadio"),
    Terreno = c("Abierto", "Abierto", "Invernadero", "Invernadero", "Abierto", "Abierto", "Abierto", "Abierto", "Invernadero", "Abierto"))
Datos
```
Para saber cuantos cultivos de cada grupo hay, contamos las veces que se repite cada uno de los niveles de la variable Grupo, es decir, preparamos una Tabla de frecuencias.
```{r}
levels (Datos$Grupo)
table (Datos$Grupo) # Tabla de frecuencias
table (Datos$Grupo)/length(Datos$Grupo) # Tabla de proporciones
table (Datos$Grupo)/10 # Vemos que es el número de observaciones mirando el entorno. Pero si cambia esta número
                    # tenemos que cambiar el scrip, mientras que utilizando el comando length(), no es necesario.
```
Para averiguar los grupos que se riegan y los que no, preparamos una Tabla de contingencias.
```{r}
table (Datos$Grupo, Datos$Agua)
Tabla = table (Datos$Grupo, Datos$Agua)
```
Si queremos averiguar las frecuencias relativas, en vez de las absolutas.
```{r}
prop.table (Tabla) # Proporción con respecto al total de los datos de la tabla
prop.table (Tabla, 1) # Proporción con respecto al total de los datos de cada fila
prop.table (Tabla, 2) # Proporción con respecto al total de los datos de cada columna
```
Si queremos averiguar el total de datos por fila o columna
```{r}
Tabla
margin.table(Tabla, 1) # Por fila
margin.table(Tabla, 2) # Por columna
```

martes, 12 de mayo de 2015

UNIR DATA FRAMES II. merge() y Reduce()


---
title: "Unir Data Frames II. merge() y Reduce()"
author: "Raúl Ortiz"
date: "Monday, May 11, 2015"
output: pdf_document
---

# Mediante el presente documento, veremos unir data.frames con el comando merge().

Creamos un par de DF para usarlos en el ejemplo
```{r}
Df1 = data.frame (
    Cultivo = c("Trigo", "Melocoton", "Sandia", "Tomate", "Cebada"),
    Grupo = c("Cereal", "Frutal", "Horticola", "Horticola", "Cereal"))
Df2 = data.frame (
    Cultivo = c("Ciruelo", "Melocoton", "Sandia", "Tomate", "Trigo"),
    Agua = c("Regadio", "Regadio", "Regadio", "Regadio", "Secano"))
Df1
Df2
```
Unimos los DF mediante el comando merge()
```{r}
merge (Df1, Df2, by = "Cultivo")
merge (Df1, Df2, by = "Cultivo", sort=F)
merge (Df1, Df2, by = "Cultivo", all.x=TRUE)
```
Qué ocurre si el campo con datos comunes no tiene el mismo nombre
```{r}
Df1 = data.frame (
    Cultivo = c("Cebada", "Melocoton", "Sandia", "Tomate", "Trigo"),
    Grupo = c("Cereal", "Frutal", "Horticola", "Horticola", "Cereal"))
Df2 = data.frame (
    Plantacion = c("Ciruelo", "Melocoton", "Sandia", "Tomate", "Trigo"),
    Agua = c("Regadio", "Regadio", "Regadio", "Regadio", "Secano"))
Df1
Df2
```
Los unimos
```{r}
merge (Df1, Df2, by.x="Cultivo", by.y="Plantacion")
merge (Df1, Df2, by.x="Cultivo", by.y="Plantacion", all=T)
```
Union de tres o mas DF con el comando Reduce()
```{r}
Df3 = data.frame (
    Cultivo = c("Cebada", "Melocoton", "Sandia", "Tomate", "Trigo","Ciruelo"),
    Terreno = c("Abierto", "Abierto", "Invernadero", "Invernadero", "Abierto", "Abierto"))
Df3
names(Df2)[1] = "Cultivo"

Reduce(merge, list(Df1,Df2,Df3)) # Arroja un DF con datos en comunes de todos ellos

Reduce(function(...) merge (..., all=T), list(Df1,Df2,Df3)) # Resulta un DF con todos los datos
```
Por último, vemos el ejemplo con los datos del ensayo de patatas que hemos utilizado en vídeos anteriores
Establezco el directorio de trabajo
```{r}
setwd("C:/Users/Raul Ortiz/Desktop/Proyectos R")
```
Cargo los datos
```{r}
DatosTesPeso = read.table("PotatoTestigoFilOrd2Peso.csv", header=T, sep="," , dec=".")
DatosTesNr = read.table("PotatoTestigoFilOrdNr.csv", header=T, sep="," , dec=".")
DatosTesPeso
View (DatosTesNr)
```
Uno los DF
```{r}
DatosTesTotal = merge(DatosTesPeso, DatosTesNr, by = "Parcela")
DatosTesTotal
```
Las variables que se repiten tras la union tiene un sufijo que indican de qué DF provienen.
También podríamos haber hecho la unión por mas de una variable al mismo tiempo.
```{r}
DatosTesTotal2 = merge(DatosTesPeso, DatosTesNr, by = c("Parcela", "Tratamiento", "Variedad"))
DatosTesTotal2
```

lunes, 11 de mayo de 2015

ORDENAR DATA FRAME II. Ordenar filas



---
title: "Ordenar Data Frame II - Ordenar filas"
author: "Raúl Ortiz"
date: "Tuesday, May 05, 2015"
output: pdf_document
---

# Mediante el presente documento, veremos como reordenar las filas de un Data Frame.

Establezco el directorio de trabajo
```{r}
setwd("C:/Users/Raul Ortiz/Desktop/Proyectos R")
```
En el vídeo como "Unir Data Frames" vimos que para utilizar el comando cbind(), uno de los requisitos era que las filas de los DF que íbamos a unir estuvieran en el mismo orden.
Veamos que pasa si no están en el mismo orden.
```{r}
DatosTesPeso = read.table("PotatoTestigoFilOrdPeso.csv", header=T, sep="," , dec=".")
DatosTesNr = read.table("PotatoTestigoFilOrdNr.csv", header=T, sep="," , dec=".")
DatosTesPeso
View (DatosTesNr)
```
¿Qué orurre si unimos los DF tal y como están?
```{r}
DatosTotal = cbind(DatosTesPeso, DatosTesNr)
View (DatosTotal)
```
Los mas lógico parece ordenar el DF "DatosTesNr"" para que el orden de las observaciones coincida con el de las parcelas, tal y como ocurre en el DF "DatosTesPeso".
Para ordenar el DF siguiendo poniendo las observaciones de la parcela 1 en la primera posición y el de la 9 en la úlitma, utilizaremos el siguiente comando.
```{r}
DatosTesNr [order(DatosTesNr$Parcela), ]
DatosTesNr1 = DatosTesNr [order(DatosTesNr$Parcela), ]
DatosTesNr # Orden del DF al cargarlo
View (DatosTesNr1)
```
Ahora ya sí podríamos utilizar rbind()
```{r}
DatosTotal = cbind(DatosTesPeso, DatosTesNr1)
View (DatosTotal)
```
Este era un ejemplo fácil, porque el DF de referencia estaba ordenado según el orden creciente (del 1 al 9) de una variable numérica.
¿Cómo lo haríamos si la variable "Parcela" del DF de referencia no estuviera ordenado de forma creciente?
```{r}
DatosTesPeso = read.table("PotatoTestigoFilOrd2Peso.csv", header=T, sep="," , dec=".")
DatosTesNr = read.table("PotatoTestigoFilOrdNr.csv", header=T, sep="," , dec=".")
DatosTesPeso
View (DatosTesNr)
```
Ninguno de los DF está ordenado de la misma manera.
Vamos a ordenar el DF "DatosTesNr" según el orden de parcela que tiene el DF "DatosTesPeso"
```{r}
DatosTesNr[order(match(DatosTesNr[,3],DatosTesPeso[,3])),]
DatosTesNr2 = DatosTesNr[order(match(DatosTesNr$Parcela,DatosTesPeso$Parcela)),]

DatosTesPeso
View (DatosTesNr2)
```
Ahora, también podríamos utilizar rbind()
```{r}
DatosTotal2 = cbind(DatosTesPeso, DatosTesNr2)
View (DatosTotal2)
```
Otras opciones para ordenar un DF es por ejemplo en orden decreciente de una variable numérica.
```{r}
DatosTesNr
DatosTesNr [order(DatosTesNr$Parcela), ]
DatosTesNr [rev(order(DatosTesNr$Parcela)), ]
DatosTesNr [order(-DatosTesNr$Parcela), ]
```
También la puedo ordenar según el orden de dos variables, una tipo Factor y otra tipo numérica
```{r}
DatosTesNr
DatosTesNr [order(DatosTesNr$Variedad,DatosTesNr$Numero40), ]
```
Si quiero que una de las variables se ordene de forma decreciente, puedo recurrir el signo "-"
```{r}
DatosTesNr [order(DatosTesNr$Variedad,-DatosTesNr$Numero40), ]
```
Por último, también se puede ordenar con comandos de la librería dplyr
```{r}
library(dplyr)
DatosTesNr %>% arrange(Parcela)
DatosTesNr %>% arrange(Variedad,Numero40)
```

ORDENAR DATA FRAME I. Ordenar columnas


---
title: "Odenar Data Frame I - Ordenar columnas"
author: "Raúl Ortiz"
date: "Monday, May 04, 2015"
output: pdf_document
---

# Mediante el presente documento, veremos como reordenar las columnas de un Data Frame.

Establezco el directorio de trabajo
```{r}
setwd("C:/Users/Raul Ortiz/Desktop/Proyectos R")
```
En el vídeo como "Unir Data Frames" vimos que para utilizar el comando rbind(), uno de los requisitos era que las columnas o variables de los DF que íbamos a unir, tuvieran los mismos nombres y en el vídeo "Renombrar variables" aprendimos a cambiar los nombres para facilitar este proceso.
Dije también en el vídeo que otro de los requisitos para utilizar el comando rbind() es que las columnas estén ordenados de la misma manera, pero vamos a ver si esto es así o no.
```{r}
DatosTesPeso = read.table("PotatoTestigoPeso.csv", header=T, sep="," , dec=".")
DatosTdoPeso = read.table("PotatoTratadoPeso3.csv", header=T, sep="," , dec=".")
names (DatosTesPeso)
names (DatosTdoPeso)
```
Los nombres de las variables son los mismos, pero no el orden en el que se presentan.
Veamos que pasa cuando ejecutamos rbind() en estas condiciones.
```{r}
DatosPesos = rbind(DatosTesPeso, DatosTdoPeso)
View (DatosPesos)
```
Comprobamos que R ha identificado los nombres de las variables o columnas y los ha reordenado para que coincidan, antes de unirlos.
En caso de que por cualquier motivo queramos dar un orden específico al DF, tenemos varias opciones.

Opción 1
Ordenar por el número de índice de las columnas. - Ya hablamos de los índices en el vídeo "Filtrar datos I"
```{r}
names (DatosTesPeso)
names (DatosTdoPeso)
DatosTdoPeso1 = DatosTdoPeso [ , c(3,2,1,7,6,5,4)]
names (DatosTdoPeso1)
```

Opción 2
Utilizar la función subset() - Ya hablamos de este comando en el vídeo "Filtrar datos II"
```{r}
DatosTdoPeso2 = subset (DatosTdoPeso, select=c(3,2,1,7,6,5,4))
names (DatosTdoPeso2)
```

Opción 3
Utilizar la función del paquete dplyr - Ya hablamos de este comando en el vídeo "Filtrar datos III"
```{r}
library(dplyr)
DatosTdoPeso3 = DatosTdoPeso %>% select(Tratamiento, Variedad, Parcela, Peso40, Peso41a45, Peso46a60, PesoMas61)
names (DatosTdoPeso3)
```

Opción 4
Utilizamos el orden de las variables o columnas del Data Frame referencia, para ordenar el DF objetivo.
```{r}
DatosTdoPeso4 = DatosTdoPeso [ , c(names(DatosTesPeso))]
names (DatosTdoPeso4)
```

Si en vez de ordenar las columnas, según el orden establecido en otro DF, queremos hacerlo en orden alfabético.
```{r}
DatosTdoPesoAZ = DatosTdoPeso [ , order(c(names(DatosTdoPeso)))]
names (DatosTdoPesoAZ)
```
En orden alfabético reverso.
```{r}
DatosTdoPesoZA = DatosTdoPeso [ , rev(order(c(names(DatosTdoPeso))))]
names (DatosTdoPesoZA)
```

RENOMBRAR VARIABLES


---
title: "Cambiar el nombre a las variables"
author: "Raúl Ortiz"
date: "Thursday, April 30, 2015"
output: pdf_document
---

# Mediante el presente documento, veremos como cambiar el nombre a las variables.

Establezco el directorio de trabajo
```{r}
setwd("C:/Users/Raul Ortiz/Desktop/Proyectos R")
```
En el vídeo anterior, sobre como "Unir Data Frames" vimos que para utilizar el comando rbind(), uno de los requisitos era que las columnas o variables de los DF que íbamos a unir, tuvieran los mismos nombres. ¿Pero qué pasa si los datos que nos envían no cumplen estos requisitos?
```{r}
DatosTesPeso = read.table("PotatoTestigoPeso.csv", header=T, sep="," , dec=".")
DatosTdoPeso = read.table("PotatoTratadoPeso1.csv", header=T, sep="," , dec=".")
names (DatosTesPeso)
names (DatosTdoPeso)
```
Para cambiar los nombres de las variables del DF DatosTdoPeso, hacemos lo siguiente.
```{r}
names (DatosTdoPeso) = c("Tratamiento", "Variedad", "Parcela", "Peso40", "Peso41a45", "Peso46a60", "PesoMas61")
names (DatosTdoPeso)
names (DatosTesPeso)
```
En caso de que solo queremos cambiar el nombre de una variable en concreto, tenemos otra opción
```{r}
DatosTdoPeso = read.table("PotatoTratadoPeso2.csv", header=T, sep="," , dec=".")
names (DatosTdoPeso)
names (DatosTesPeso)
names (DatosTdoPeso)[3] = "Parcela"
names (DatosTdoPeso)
```
Por último, si tuviéramos un DF con muchas columnas, averiguar el número de columna cuyo nombre quiero cambiar puede ser más complicado y dar lugar a error. En ese caso es más recomendable utilizar recurrir a la librería "reshape"
```{r}
# install.packages("reshape")
require(reshape)
DatosTdoPeso = rename(DatosTdoPeso, c(Parcela="Subparcela"))
names (DatosTdoPeso)
```

UNIR DATA FRAMES. rbind() y cbind()


---
title: "Unir DataFrames. rbind() y cbind()"
author: "Raúl Ortiz"
date: "Tuesday, April 21, 2015"
output: pdf_document
---

# Mediante el presente documento, veremos como unir DataFrames mediante los comandos rbind() y cbind().

Establezco el directorio de trabajo
```{r}
setwd("C:/Users/Raul Ortiz/Desktop/Proyectos R")
```
Supongamos que los datos nos llegan por partes, es decir, que nos llegan de las parcelas tratadas los pesos por un lado y el número de patatas por otro. Lo mismo con los datos de las parcelas testigo. En total, cuatro tablas con datos
```{r}
DatosTesPeso = read.table("PotatoTestigoPeso.csv", header=T, sep="," , dec=".")
DatosTesNr = read.table("PotatoTestigoNr.csv", header=T, sep="," , dec=".")
DatosTdoPeso = read.table("PotatoTratadoPeso.csv", header=T, sep="," , dec=".")
DatosTdoNr = read.table("PotatoTratadoNr.csv", header=T, sep="," , dec=".")
```
Unimos los DF con los datos de los pesos del Testigo con los del Tratado. rbind = unir agregando filas, cuando sabemos que los nombres de las columnas (variables), son iguales y están en el mismo orden.
```{r}
names (DatosTesPeso)
names (DatosTdoPeso)
DatosPesos = rbind(DatosTesPeso, DatosTdoPeso)
View (DatosPesos)
```
Hacemos lo mismo con los datos referentes al número de patatas de las parcelas Testigo y Tratadas.
Comprobamos antes los nombres y el orden de las columnas.
```{r}
names (DatosTesNr)
names (DatosTdoNr)
DatosNumero = rbind(DatosTesNr, DatosTdoNr)
View (DatosNumero)
```
Ahora sólo nos falta unir los datos referentes al número de patatas por muestra.
Vemos que las observaciones de cada parcela se han anotado en el mismo orden, la primera fila corresponde a la parcela 1 y la última a la 18, en ambos DF, el de DatosPesos y el de DatosNumero.
Podemos proceder al la unión.
```{r}
DatosTotal = cbind(DatosPesos, DatosNumero)
View (DatosTotal)
```
Observamos que las columnas Tratamiento, Variedad y Parcela se encuentran repetidas.
Lo podemos solucionar uniendo sólo las columnas que nos interesan.
```{r}
DatosTotal = cbind(DatosPesos, DatosNumero[ , 4:7])
View (DatosTotal)
```