Dplyr

dplyr parece que prefiere los factores

R

Con datos bajados de aquí:

library(MicroDatosEs)
library(dplyr)
library(microbenchmark)
library(ggplot2)

censo <- censo2010("MicrodatosCP_NV_per_nacional_3VAR.txt")

censo_char <- as.data.frame(censo[,
    c("CPRO", "SEXO", "ECIVIL", "FACTOR")])
censo_factor <- censo_char
censo_factor$CPRO <- factor(censo_factor$CPRO)


foo <- function(x)
    x %>% group_by(CPRO) %>%
    summarise(res = sum((SEXO == "Mujer") *
        (ECIVIL == "Divorciado") * FACTOR) /
        sum(FACTOR) * 100)

res <- microbenchmark(
    char = foo(censo_char),
    factor = foo(censo_factor),
    times = 10
)

autoplot(res)

Da:

¿No es sorprendente? De hecho, plyr es más rápido que dplyr en este caso si no se usan factores.

Notas:

  • El hilo de por qué es así en lugar de otra manera se pierde en código escrito en C++. Para otra vida (mía o de otro).
  • Debo agradecer a Diego Castro el intercambio de ideas, código y perplejidades que dieron pie a todo lo de arriba.

¿Soy un dinosauRio? Sobre las novedades de R

R

Trato de estar abierto a lo nuevo. Tantos años soportando dinosaurios me han vacunado contra el conservadurismo tecnológico. De hecho, me produce arcadas. La experiencia, no obstante, me ha hecho permeable al efecto Lindy, lo que me da ocasión de saludar a mis amigos emaqueros.

Las cosas cambian y en R estamos viviendo una especie de revolución. Mi argumento, para impacientes, es que:

  • Es más superficial que sustancial: es azúcar sintáctico.
  • En ciertos aspectos, no es positiva y mina ciertos principios valiosos que hicieron de R un lenguaje popular.

Cuento todo esto a raíz de una reseña a un novedoso curso de R. Lo es en tanto que, dicen:

Dos nuevos tutoriales sobre data.table y dplyr

R

Los productos de Apple, aun admitiendo su calidad, resuelven problemas que yo hace años que no tenía. Tanto data.table como dplyr vinieron a resolver problemas a los que muchos nos enfrentábamos con sudor y lágrimas.

Ha aparecido recientemente una serie de tutoriales sobre ambos paquetes que recomiendo:

Y mis comentarios:

  • Para el 99% de mis problemas de manipulación de datos, me sobra con, además de R base, reshape2 y plyr.
  • Para datos más grandes, me decanto por data.table. En gran medida, porque es previo a dplyr.
  • No obstante, tengo la sensación de que dplyr acabará llevándose el gato al agua: tengo suficientes años como para haber presenciado sin que me las cuenten batallas anteriores: Beta vs VHS, Wordperfect vs Word, etc.

¿Cuál es la "mejor" manera de ordenar un dataframe?

R

El título de esta entrada es una pregunta honesta. Yo siempre he utilizado order así:

    iris[order(iris$Petal.Length),]

Y para ordenar por dos (o más columnas), así:

    iris[order(iris$Petal.Length, iris$Petal.Width),]

Es a lo que estoy acostumbrado. Sin embargo, la construcción anterior desconcierta a quienes dan sus primeros pasos en R. dplyr dispone de la función arrange con una sintaxis un tanto más natural:

    library(dplyr)
    arrange(iris, Petal.Length, Petal.Width)

pero, de nuevo, puede resultar desconcertante tener que recurrir a paquetes avanzados: ¿es conveniente introducir a los principiantes en el proceloso mundo de los paquetes para la simple y muy natural operación de ordenar un dataframe?

Huele a bicho (en plyr)

R
library(plyr)

dat <- data.frame( a = sample(c("x", "y"),    100, replace = T),
                    b = sample(c(TRUE, FALSE), 100, replace = T))

ddply(dat, .(a), summarize, b = sum(b), no.b = sum(!b))
ddply(dat, .(a), summarize, no.b = sum(!b), b = sum(b))

Huele a bicho, ¿verdad?

plyr, dplyr, data.table: ¿qué opinas?

R

Fui un pájaro mañanero con [plyr](http://cran.r-project.org/web/packages/plyr/index.html).

Probé una vez [data.table](http://cran.r-project.org/web/packages/data.table/index.html) y no me convenció. Volví a él cuando realmente lo necesitaba y ahora es la prolongación de mis dedos.

Aún no me he puesto con [dplyr](http://cran.r-project.org/web/packages/dplyr/index.html) aunque he visto el suficiente código escrito con él que no creo que me cueste mucho comenzar a usarlo.

Pero tengo la sensación de que tenemos un cisma como el de vi contra emacs en ciernes. Comienza a haber, parece, partidarios acérrimos de tirios y troyanos. Así que abro la sección de comentarios para que opines sobre estos paquetes. A mí y a muchos otros lectores nos gustaría conocer tu opinión al respecto. ¿Cuál utilizas? ¿Qué te gusta de cada cual? ¿Cuál recomendarías?

Totales agregados por bloques en tablas

R

En ocasiones uno quiere añadir un total calculado en ciertos bloques a una tabla. Por ejemplo, en la tabla

set.seed(1234)
ventas.orig <- data.frame(
    cliente = rep(1:10, each = 5),
    producto = rep(letters[1:5], times = 10),
    importe = rlnorm(50))

tenemos clientes, productos e importes. Y nos preguntamos por el porcentaje en términos de importe que cada producto supone para cada cliente.

Una manera natural pero torpe de realizar este cálculo consiste en usar un objeto intermedio y merge:

library(plyr)
tmp <- ddply(ventas.orig, .(cliente),
    summarize, total = sum(importe))
ventas <- merge(ventas.orig, tmp)
ventas$pct.producto <- 100 * ventas$importe /
    ventas$total

No os asustéis, se puede hacer aún peor (p.e., usando sqldf). Pero existen dos maneras, cuando menos, de hacerlo mejor. La primera es usando data.table.