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.

¿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.

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: El de data.table El de dplyr (parte I, parte II) 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.

¿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.

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: