2015-03-27

Diagramas de caja de un data frame con ggplot2: una o varias columnas

Title Vamos a ver dos ejemplos específicos que dejamos de lado en la introducción a los diagrama de caja en ggplot2. En ambos ejemplos la sintaxis difiere notablemente de la empleada con la función boxplot {graphics}.

Una columna o variable

Es necesario crear una variable falsa de agrupación factor(0). Además, borramos la etiqueta y las marcas de este eje ficticio x.

# ggplot2
require(ggplot2
bp <- ggplot(iris, aes(factor(0), Sepal.Width))
bp + geom_boxplot() + xlab("") + scale_x_discrete(breaks = NULL)
  • Mediante la función qplot.
qplot(data = iris, x = factor(0), y = Sepal.Width, geom = "boxplot", xlab = "") + scale_x_discrete(breaks = NULL)
  • El equivalente con boxplot {graphics}.
# Base graphics
boxplot(iris$Sepal.Width)

Todas las columnas

Empleamos el paquete reshape2 para convertir los datos en el formato adecuado con la función melt antes de representarlos. Representará solamente aquellas columnas de tipo numérico.

library(reshape2)
ggplot(data = melt(iris), aes(x = variable, y = value)) + geom_boxplot(aes(fill = variable))

Selección las columnas

library(MASS)
ggplot(data = melt(UScereal), aes(x = variable, y = value)) + 
  geom_boxplot(aes(fill = variable))
Como cada variable se encuentra en un rango muy diferente, seleccionamos algunas columnas con rangos similares.

data <- UScereal[, c('protein', 'fat', 'fibre', 'sugars')]
ggplot(data = melt(data), aes(x = variable, y= value)) + 
  geom_boxplot(aes(fill = variable))

Notas

Los diagramas de caja en ggplot2, al contrario que con la función boxplot, están pensados para representar dos variables. Necesitan 3 argumentos:

data = data frame, en el caso de la función qplot es necesario que vaya precedido de data =.
x = un factor o variable categórica. Dentro de la función aes en el caso de ggplot.
y = un vector numérico. Dentro de la función aes en el caso de ggplot.

En el caso de una sola variable necesitamos crear un factor o variable categórica falsa factor(0) para que agrupe por el mismo. En el caso de varias columnas necesitamos que los valores (vector numérico) en una sola columna, lo que obtenemos con la función melt. Automáticamente toma la columna Species como id variables (identifier variables) por ser la única variable categórica (factor) del data frame.

head(melt(iris))
Using Species as id variables
  Species     variable value
1  setosa Sepal.Length   5.1
2  setosa Sepal.Length   4.9
3  setosa Sepal.Length   4.7
4  setosa Sepal.Length   4.6
5  setosa Sepal.Length   5.0
6  setosa Sepal.Length   5.4

Referencias

2015-03-25

Crear un data frame en R mediante el editor de datos

En R podemos emplear el editor de datos para crear un data frame rápidamente, como si se tratara de una hoja de cálculo en Excel. Aunque no es muy eficiente para construir una tabla muy grande, en ocasiones puede ser más práctico que importar un fichero de texto o combinar vectores.

Title

Ejemplo

  • Creamos el data frame
tabla <- data.frame(Año = numeric(), Ventas = numeric())
tabla <- edit(tabla)
  • Lo mostramos en la consola
tabla
   Año Ventas
1 2010    1.5
2 2011    3.0
3 2012    5.0
4 2013    2.5
5 2014    6.0
6 2015    7.2
  • Si necesitamos editarlo recurrimos a la función fix. Abrirá el editor de datos y al cerrarlo se habrán guardado los cambios.
fix(tabla)
tabla
   Año Ventas
1 2010      3
2 2011      5
3 2012      5
4 2013      8
5 2014      6
6 2015     10
7 2016     15

Entradas relacionadas

Referencias

2015-03-23

Tabla dinámica utiliza la función contar en vez de suma con celdas vacías

Title En las tablas dinámicas, Excel utiliza como función resumen la función suma para datos numéricos y la función contar para datos no numéricos:

Se usa de forma predeterminada para los campos de valor que tienen valores numéricos. Si el campo contiene espacios en blanco o numérico (texto, fecha, o booleano) los valores cuando lo coloca en el área de valores de la Lista de campos, la tabla dinámica utiliza la función Contar para el campo.

Problema

Origen de datos con celdas en blanco:

Tabla dinámica que cuenta los valores en lugar de sumarlos:

Solución

  1. Cambiar la función resumen para sumar en lugar de contar
  2. Varios modos de acceder a la Configuración de campo valor:
    • En la cinta de opciones Campo activo: Configuración de campo.
    • Botón secundario del ratón sobre el campo en cuestión y seleccionamos Configuración de campo valor.
    • Desde la lista de campos de tabla dinámica, haciendo clic sobre el campo.

  3. Ir a las celdas en blanco y rellenarlas con ceros
    • Seleccionamos el rango de origen de datos, área actual alrededor de la celda activa: Ctr+Mayús+*
    • Ir al menú Ir a Especial y seleccionamos Celdas en blanco. Atajo F5 o Ctrl+I, Alt+E, presionamos B y Aceptar.
    • Escribimos 0 y, con el botón Ctrl presionado, hacemos clic en Entrar.

Referencias

2015-03-20

Project Euler - Problema 2 en R

Title Continuamos con los problemas planteados en Project Euler.

Problema

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

Cada nuevo término en la sucesión de Fibonacci se genera mediante la adición de los dos términos anteriores. Al comenzar con 1 y 2 , los primeros 10 términos serán:

1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , ...

De los términos de la sucesión de Fibonacci cuyos valores no superan los cuatro millones, hallar la suma de aquellos que son pares.

Solución

Creando nuestra función

fib <- function(n) {
    a = 0
    b = 1
    for (i in 1:n) {
        tmp = b
        b = a
        a = a + tmp
    }
    return(a)
}
x <- sapply(1:33, fib)
sum(x[x%%2 == 0]) 
Utilizamos el paquete numbers

require(numbers) # función Fibonacci 
x <- fibonacci(33, TRUE) # Secuencia de números Fibonacci. Ver notas.
even <- x%%2 == 0 # Par o impar
df <- data.frame(x, even)
sum(df[even == TRUE, ]$x)
# Con la función subset
sum(subset(df, even == TRUE)$x) 
# Empleando el paquete dplyr
require(dplyr)
filter(df, even == TRUE) %>% summarise(sum(x))
[1] 4613732

Notas

Creamos la secuencia de números Fibonacci de 34 hacia abajo pues fibonacci(34) es el primero en exceder los 4 millones: 5702887. Por tanto, no sería necesaria la condición < 4000000, pero la dejamos como referencias por si hubiéramos partido de un número Fibonacci mayor.

fibonacci(33)
[1] 3524578
fibonacci(34)
[1] 5702887

Referencias

2015-03-18

Convertir fichero Excel a CSV desde Access

Title Recientemente necesité convertir un fichero xlsb en csv separado por punto y coma antes de importarlo en Access. El código es el siguiente:

Sub Excel2csv()
       
    Dim FolderPath As String
    Dim filename As String
    Dim WB As Workbook
   
    FolderPath = Application.CurrentProject.Path & "\"
    filename = "Fichero.xlsb" ' Fichero origen

    Set xlApp = CreateObject("Excel.Application")
    With xlApp
        .DisplayAlerts = False
        .Application.Visible = False
        .Workbooks.Open (FolderPath & filename)
        .ActiveWorkbook.Saveas filename:=Application.CurrentProject.Path & "\" _
        & "Fichero.csv", FileFormat:=xlCSV, Local:=True ' Fichero destino
        .Workbooks.Close
        .DisplayAlerts = True
    End With
    Set xlApp = Nothing

End Sub

Notas

  • Es necesario añadir previamente la librería: Microsoft Access 15.0 Object Library
  • Podemos usar el mismo para guardar ficheros *.xls, *.xlsx, o *.xlsm como *.csv, tan sólo cambiamos la extensión del fichero origen.
  • Al haber deshabilitado las advertencias, el código reescribirá el fichero csv al ejecutar el código.
  • En el caso de querer guardar el csv separado por comas eliminamos del código anterior el argumento:

    Local:=True

Referencias

2015-03-16

Diagramas de caja con ggplot2 en R. Una introducción.

Title En ocasiones anteriores creamos diagramas de caja usando el paquete graphics cargado por defecto en R. En la siguiente entrada crearemos diagramas de caja con el paquete ggplot2.

Ejemplos

Construiremos un gráfico simple e iremos examinando distintas propiedades.

  • Vertical
bp <- ggplot(iris, aes(x = factor(Species), y = Sepal.Width)) 
bp + geom_boxplot() 
  • Horizontal
bp + geom_boxplot() + coord_flip()
  • Líneas horizontales al final de los bigotes
bp + geom_boxplot() + coord_flip() + stat_boxplot(geom ='errorbar') 
  • Puntos de datos. Para evitar que se superpongan, geom_jitter los desplaza horizontalmente.
bp + geom_boxplot() + geom_jitter() 
  • Cuñas o muescas (notches). Para representar el intervalo de confianza de la mediana.
bp + geom_boxplot(notch = TRUE)
  • Relleno. Como la variable Species es un factor, crea un color para cada especie en lugar de una escala.
bp + geom_boxplot(aes(fill = Species))
  • Gradiente de color. Un ejemplo no particularmente útil.
bp <- ggplot(iris, aes(factor(Sepal.Length), Sepal.Width)) # One per any Sepal.Length observation
bp + geom_boxplot(aes(fill = Sepal.Length))
  • Paleta de colores
bp <- ggplot(iris, aes(x = factor(Species), y = Sepal.Width, fill = Species)) 
bp + geom_boxplot() + scale_fill_brewer(palette = "Blues")

Entradas relacionadas

Referencias

Nube de datos