R

Grid, Scala y arbolitos fractales

Inspirado por

  • los arbolitos que he visto esta mañana en mi semivuelta al lago de Zúrich,
  • las cosas que estoy leyendo últimamente sobre el paquete grid de R (p.e., grid graphics, de Murrell)
  • mi curso de scala y
  • este enlace

me he decidido a reescribirlo como Dios manda (y no como de primeras se le ocurriría a un neoingeniero al que solo le han enseñado MatLab y que, por lo tanto, tiene vetado el acceso a cualquier tipo de empresa tecnológica puntera). Me ha quedado así:

Las VI Jornadas de Usuarios de R, en Santiago

R

Escribo para anunciar públicamente que están en marcha las VI Jornadas de Usuarios de R. Se celebrarán este año en Santiago, los días 23 y 24 de octubre de 2014.

Esta nueva edición debe mucho a la colaboración de Miguel Ángel Rodríguez Muiños, al Centro de Novas Texnologías de Galicia y otras asociaciones gallegas vinculadas al software libre.

Todavía no está disponible el programa (que, en cierto modo, es responsabilidad de vosotros: estáis invitados a enviar propuestas de ponencias y talleres).

Embalses en España: otro ejercicio inconcluso de "web scraping"

R

Vi el otro día que alguien había conseguido datos de la entrada en funcionamiento de las presas de EE.UU. y me picó la curiosidad: ¿se podrán conseguir también para España?

La respuesta es afirmativa.

El código para bajarse (y adecentar un poco) la base de datos es:

library(XML)

## bajada de datos
tmp <- lapply(1:47,
                function(x)
                readLines(paste("http://www.seprem.es/presases.php?p=",
                                x, sep = "")))
tmp2 <- lapply(tmp, readHTMLTable)

## limpieza de datos
res <- lapply(tmp2, function(x) x[[1]])
res <- do.call(rbind, res)
res <- res[,-c(1,7)]
res <- res[!is.na(res$V2),]
res <- res[-(1:5),]

res <- data.frame(lapply(res, as.character),
    stringsAsFactors=F)
names(res) <- make.names(as.character(res[1,]))

## filtros de filas
res <- res[res$Nombre != "Nombre",]
res <- res[res$Nombre != "",]
res <- res[!grepl("Presas", res$Nombre), ]
res <- res[!grepl("DIQUE DEL", res$Nombre), ]

colnames(res) <- c("nombre", "vertiente",
    "altura", "hm3", "finalizada")
res <- res[!is.na(res$vertiente),]

## texto a numérico
res$altura <- as.numeric(gsub(",", ".", res$altura))
res$hm3 <- as.numeric(gsub(",", ".", res$hm3))
res$finalizada <- as.numeric(res$finalizada)

## más filtros (se aplican a obras que no son embalses)
res <- res[!is.na(res$hm3), ]

## los embalses en construcción no tienen fecha de
## finalización
res$finalizada[is.na(res$finalizada)] <- 2015

En cuanto a qué hacer con ellos, me limitaré a mostrar la salida de

Una de gráficos casi artísticos con R

Hoy traigo una selección a cuatro páginas en que podréis encontrar gráficos casi artísticos creados con R. En la primera de ellas se construye el fractal de Collatz.

En las dos siguientes, los autores construyen animaciones. Una de ellas para ilustrar el mecanismo de la regresión local y el segundo para crear figuras en 3D.

London

Y el último, trata de mapas. En particular, de cómo sobreimponer sobre ellos datos de rutas.

Aventuras de "web scraping": cómo bajarse todo el BOE

R

Rescato aquí para futura o ajena referencia un pedazo de código que utilicé un día para un proyecto que se abortó y que tenía que ver con el análisis del texto del BOE. Reza así:

setwd("~/boe/boes")

library(RCurl)

h = getCurlHandle()

for( i in 1:3231){
  mi.url <- paste("http://www.boe.es/diario_boe/xml.php?id=BOE-A-2013-", i, sep = "")
  nom.fich <- paste("2013-A-",
    formatC(i, width = 6, format = "d", flag = "0"),  ".xml", sep = "")
  res <- getURI(mi.url, curl = h)
  cat(res, file = nom.fich)
}

for( i in 1:3212){
  mi.url <- paste("http://www.boe.es/diario_boe/xml.php?id=BOE-B-2013-", i, sep = "")
  nom.fich <- paste("2013-B-",
    formatC(i, width = 6, format = "d", flag = "0"),  ".xml", sep = "")
  res <- getURI(mi.url, curl = h)
  cat(res, file = nom.fich)
}

No me preguntéis por qué el contador solo llega hasta tres mil doscientos y pico. O por qué no itero hasta que getURI devuelva un error.

Reponderación de componentes: un ejemplo

Esta entrada es la continuación de La escala natural de la varianza. En ella vimos cómo los componentes de un PCA pueden tener un peso que pudiera no guardar relación con su importancia práctica.

Si uno quiere trabajar con las principales componentes de un PCA sobre unos datos, puede que la escala sea irrelevante (p.e., si quiere utilizar modelos lineales). Pero hay casos egregios en los que no sucede así.

@R_Hisp, la cuenta oficial de la Comunidad R Hispano

R

Finalmente, la Comunidad R Hispano dispone de una cuenta oficial en Twitter.

El anuncio público lo realizó Emilio López Cano, miembro de la junta de la asociación y que va a coordinar la cuenta con ayuda de otros voluntarios.

Os animo a seguir esa cuenta para estar al tanto de las novedades de la asociación en la que, como dice Emilio (en el enlace anterior), hay y va a seguir habiendo movimiento.

No hay motivo para no actualizar tu R a la última versión

R

Ayer se publicó la versión 3.1.0 de R. No es gran noticia: aparecen nuevas versiones cada no muchos meses.

No hay motivo para no actualizar. Pero sí para hacerlo: las nuevas versiones corrigen errores en las anteriores y, además, encontrarás poco soporte en los foros para ese R 2.1.5 viejuno que aún mantienes por pereza.

Para quienes usen R en plataformas donde el software no se actualiza automágicamente, existe el paquete installr que permite actualizar la versión de R con menos esfuerzo que antaño haciendo

Mapas: cosas casi increíbles que pueden hacerse con R

Nunca pude ser un erizo. Lo intenté durante años y acabé en el sicólogo. Si el cuerpo me hubiese dado, ahora, tal vez, como algunos compañeros de promoción, sería un experto en un área diminuta del conocimiento y corregiría exámenes los fines de semana. Descubrí con tiempo y muchas sesiones de a 60 euros la hora que había nacido para ser un zorro, un merodeador que olisquea aquí y allá.

Una lectura superficial de estas páginas que escribo puede dar la impresión de que contienen conocimientos profundos (¡ojalá!). Una lectura profunda, que contiene superficialidades (¡convengo!). Son obra de un zorro.

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.

Los sospechosos habituales y Python

Llamo sospechosos habituales a esos programas y lenguajes para el análisis de datos distintos de R cuya decreciente popularidad nos parece tan natural a los partidarios de este último. Abundan los análisis de cuotas de mercado tales como What Analytic Software are People Discussing?

¿Cuáles son estos sospechosos habituales? Pues SAS, SPSS y algún otro: Stata, Statistica, Minitab,…

Sin embargo, R tiene competidores más serios a medio plazo. Uno de ellos, el más importante, es Python. Lo veo a mi alrededor: son muchos los físicos, los ingenieros, los informáticos que tienen experiencia en ese lenguaje y, sintiéndose cómodos en él —y les alabo el gusto— quieren utilizarlo para analizar datos cuando les toca.