SparkR 1.4: carga de ficheros CSV

He instalado Spark 1.4 recientemente y he comenzado a cacharrear. Antes de nada, quiero cargar datos. Advierto que ha cambiado sustancialmente la API de SparkR. Entre otras novedades, desapareció (o más bien, se escondió) la función textFile, que permitía leer ficheros línea a línea. Ahora está pero no se exporta. La verás solo si haces SparkR:::textFile. ¿Signo de deprecación? Se pueden crear un DataFrame (tablas distribuidas de Spark) a partir de un data.frame de R: ...

23 de junio de 2015 · Carlos J. Gil Bellosta

rPython & Anaconda

Nota: publico hoy en inglés en atención al público potencial de la entrada. rPython lets R users call Python code. Anaconda is a completely free enterprise-ready Python distribution for large-scale data processing, predictive analytics, and scientific computing. Not surprisingly, some users want to call Anaconda Python rather than their system’s default Python. However, Anaconda is a very particular package: unlike most other packages, whose files are scattered in a diversity of locations, it is self contained in a single directory. This helps Anaconda solve some problems, like the library hell. It is intended to provide the same experience regardless of the specifics of the host system. ...

22 de junio de 2015 · Carlos J. Gil Bellosta

La encuesta de presupuestos familiares, en MicroDatosEs

Hoy he subido una nueva versión del paquete MicroDatosEs a r-forge que incluye herramientas para cargar los datos de la Encuesta de Presupuestos Familiares. Aún no está en CRAN, pero estáis invitados a probarla instalando la versión de desarrollo mediante install.packages("MicroDatosEs", repos="http://R-Forge.R-project.org") La parte del paquete que se encarga de la EPF es obra de Diego Paniagua, que es uno de los estudiantes del Experto en Data Science de la UTAD. La aportación a este paquete es, de hecho, parte de su proyecto final. ...

18 de junio de 2015 · Carlos J. Gil Bellosta

Liberado Spark 1.4

El anuncio de la liberación de la versión 1.4 de Spark se ha materializado. Está aquí. ¿Qué trae de novedad la versión 1.4? La integración con SparkR —antes había que instalarlo con algo de dolor independientemente— y, aparentemente, data.frames distribuidos y, cuentan, una sintaxis similar a la de dplyr —honestamente, hubiera preferido otra— para manipularlos. Iré desgranando por aquí novedades. Y estoy pensando organizar una install & tutorial party un día de estos en Madrid. ¿Alguien se animaría?

17 de junio de 2015 · Carlos J. Gil Bellosta

Paralelismo en R: memo[rándum]

Esta es una nota que me dejo a mí mismo sobre paralelización en R para no tener que ir buscándola en otras partes: library(parallel) foo <- function(i){ Sys.sleep(i) } cl <- makeCluster(4) system.time(parSapply(cl, 1:4, foo)) # user system elapsed # 0.025 0.006 4.007 system.time(sapply(1:4, foo)) # user system elapsed # 0.039 0.033 10.001 stopCluster(cl)

15 de junio de 2015 · Carlos J. Gil Bellosta

Ver 53000 filas

Me preguntaban cómo ver con R una tabla con 53000 filas. Mi yo menos diplomático quiso contestar: define ver. Lo reformulé más amablemente y se me contestó: como en Excel. La pregunta es: ¿permite Excel ver 53000 registros? De hecho, ¿se pueden ver 53000 registros? Impresos a razón de línea por centímetro, ocuparían 530 metros y andar a paso vivo del primero al último costaría cinco minutos. Con 53000 registros, ver (como trasunto de entender) es una cosa distinta de tener delante. Lo siento, pero ver otra cosa que la facturación de los últimos quince días o los movimientos de la cuenta del último mes es algo distinto de lo que vacuamente promete Excel.

10 de junio de 2015 · Carlos J. Gil Bellosta

Oh, no, ¡datastepr!

Hoy no estoy de humor. He tratado de completar mi primer anillo en dos años y ha resultado un total fracaso. Mi bici buena estaba pinchada: me he enterado a un kilómetro de casa. He tenido que salir en otra, una de esas viejas de Decathlon, que no sé bien cómo apareció una vez en mi casa, que pesa un quintal y que cambia de marchas cuando y como quiere. No solo me he quedado a la mitad del recorrido sino que, además, he podido constatar cómo el paisanaje de Madrid ha descompuesto todas las fuentes que en el proyecto original jalonaban el recorrido. Supongo que con la inestimable ayuda, por omisión, de nuestros munícipes. Aquello, más que un anillo ciclista, parecía Mad Max I. ...

9 de junio de 2015 · Carlos J. Gil Bellosta

Una de las cosas que me irritan de R

R (y su comunidad) es en ocasiones irritante. Os cuento por qué. El otro día quise pintar un grafo sobre un mapa. No quería usar ninguno de los layouts al uso porque cada nodo estaba georeferenciado. Me interesaba, además, pintar el grafo sobre una capa (de Google Maps u OSM) para contextualizarlo (¿conterrenizarlo?) mejor. No es demasiado complicado escribir una función que haga lo anterior. Pero es razonable pensar que alguien pudiera haberlo hecho antes. Et voilá. Después de mucho buscar, di con las funciones geom_edgeset y geom_nodeset del paquete popgraph que resolvían el problema. ...

8 de junio de 2015 · Carlos J. Gil Bellosta

Grafos por vecindad en mapas

Dando vueltas (infructuosas) al asunto de los cartogramas he dado con un subproducto con el que, por hoy, me conformo: crear un grafo a partir de relaciones de vecindad entre polígonos. La magia, obra de [spdep::poly2nb](http://www.inside-r.org/packages/cran/spdep/docs/poly2nb); el código, library(maptools) library(spdep) library(igraph) # fichero descargado del INE aragon <- readShapePoly("ccaa00c02.shp") plot(aragon) aragon.nb <- poly2nb(aragon) # vértices vertices <- aragon@data vertices$id <- 1:nrow(aragon@data) vertices <- vertices[, c("id", setdiff(colnames(vertices), "id"))] # coordenadas aproximadas de los vértices my.layout.orig <- do.call(rbind, lapply(vertices$id, function(i) aragon@polygons[[i]]@Polygons[[1]]@labpt)) # aristas aristas <- do.call(rbind, lapply(1:length(aragon.nb), function(x) data.frame(from = x, to = aragon.nb[[x]]))) aristas <- aristas[aristas$from < aristas$to,] aristas <- aristas[aristas$from %in% vertices$id,] aristas <- aristas[aristas$to %in% vertices$id,] # grafo g <- graph.data.frame(aristas, directed = FALSE, vertices) plot(g, layout = my.layout.orig, vertex.label = NA, vertex.size = 0.1)

27 de mayo de 2015 · Carlos J. Gil Bellosta

Grafos sobre mapas

He escrito de grafos, he escrito de mapas; hoy hablaré de la combinación de ambas cosas. Tengo un grafo cuyos nodos están geoposicionados. Lo quiero estudiar utilizando herramientas de grafos (vía igraph) pero después representarlos sobre una capa con información geográfica (una foto satelital de Google Maps, vamos). La red va a ser la de guifi.net en los derredores de Barcelona. guifi.net es un proyecto para crear una red de telecomunicaciones mancomunada, abierta, libre y neutral. Quienes forman parte de ella colocan antenas que se conectan con otras de la red y comienzan en enviar bits. Las antenas y sus conexiones conforman una red que se puede estudiar como cualquier otra: ¿qué nodos/enlaces son más centrales/críticos? Etc. ...

18 de mayo de 2015 · Carlos J. Gil Bellosta