R
TelegRam[.]me!
Telegram es un sistema de mensajería por internet similar a Whatsapp, aunque con algunas diferencias notables:
- No es de Facebook
- Una vez tienes una cuenta, puedes usarla desde distintos dispositivos (Linux incluido)
- Tiene menos usuarios
- Es programable
De lo último es ilustración esta “conversación” que tuve con la cuenta @TeleR:
Los detalles, aquí. Y el crédito, para Rubén Tobalina.
Taller de mapas con R el 14 de abril en Madrid
Mi entrada de hoy es para anunciar un taller de mapas con R que tendrá lugar el día 14 de abril de 18 a 21 horas en Martina Cocina (cómo llegar).
Lo impartirá Beatriz Martínez, socióloga dedicada a la investigación social y de mercados, que ha trabajado en numerosos proyectos: desde investigación digital al desarrollo rural o programas de inclusión social. Está especializada en la la visualización de datos. Algunos de sus trabajos pueden verse en visualizados.com.
Pues sí: un curso de redes sociales con R
Debido a la positiva acogida de la propuesta para organizar un curso de redes sociales con R… pues se va a hacer.
- Cuándo: Los días 9 (jueves), 15 y 22 (miércoles ambos) de abril, de 18:00 a 20:30-21:00 horas.
- Lugar: Las cuevas de MartinaCocina (Cascorro 11, 28005 Madrid).
- Programa: Las partes 1-6 de este tutorial. Se completará en modo taller resolviendo por el camino las dudas que surjan y discutiendo los conceptos que aparecen en él. No tiene formato de clase magistral. Se espera la participación activa de los asistentes.
- Prerrequisitos: Cierto conocimiento de R es recomendable. Sospecho que no será provechoso para quienes, cuando menos, desconozcan los rudimentos de la programación (no necesariamente en R).
- Otras consideraciones: Las plazas son limitadas. Probablemente quede quien no pueda asistir. Por eso se espera de quienes obtengan una plaza un mínimo compromiso y seriedad, es decir, asistencia.
- Registro: Aquí. En unos días se cerrará el registro y, de exceder el aforo, se procederá a un sorteo para asignar las plazas; véase el punto anterior sobre la seriedad, el compromiso y la asistencia.
Compresión con SVD
lo he creado con
library(png)
tmp.file <- tempfile()
download.file("http://datanalytics.com/uploads/greco.png", tmp.file)
m <- readPNG(tmp.file)
svd.m <- svd(m)
filtra.svd <- function(svd, k){
tmp <- svd
tmp$d[(k+1):length(tmp$d)] <- 0
res <- tmp$u %*% diag(tmp$d) %*% t(tmp$v)
res[res > 1] <- 1
res[res < 0] <- 0
plot(1:2, type='n', xlab = "",
ylab = "", xaxt = "n", yaxt = "n",
main = paste(k, "primeras componentes", sep = " "))
rasterImage(res, 1, 1, 2, 2)
}
layout(matrix(1:9, 3, 3, byrow = T))
sapply(c(1,2,3,5,10,15,20,30,50),
function(k) filtra.svd(svd.m, k))
¿Un curso de redes sociales con R?
Se me ha propuesto organizar un curso, taller o similar de redes sociales y su análisis con R. De nuevo, presencial.
Mi propuesta —dado que soy lego en el asunto— es organizar un taller basado en este. Ahí va mi propuesta: en una serie de sesiones en MartinaCocina plantamos un proyector y una pizarra y entre todos vamos avanzando en el tutorial y resolviendo las dudas colaborativamente.
Por supuesto, el asunto no estaría planteado como clase unidireccional en el que alguien habla y explica y los demás asienten. Más bien, como un taller de pares que aprenden y que a la voz de ya estamos todos pasamos al siguiente asunto.
Datos en formato largo y melt
En ocasiones uno recibe datos no muy distintos de
aragon <- read.table("http://datanalytics.com/uploads/pob_aragon",
header = T, sep = "\t")
aragon
# Provincias Periodo Hombres Mujeres
# 1 Huesca 2014 113840 111069
# 2 Huesca 2004 107961 104940
# 3 Teruel 2014 71449 68916
# 4 Teruel 2004 71073 68260
# 5 Zaragoza 2014 471675 488436
# 6 Zaragoza 2004 441840 455510
Los mismos datos en formato largo son:
library(reshape2)
aragon.largo <- melt(aragon, id.vars = c("Provincias", "Periodo"))
aragon.largo
# Provincias Periodo variable value
# 1 Huesca 2014 Hombres 113840
# 2 Huesca 2004 Hombres 107961
# 3 Teruel 2014 Hombres 71449
# 4 Teruel 2004 Hombres 71073
# 5 Zaragoza 2014 Hombres 471675
# 6 Zaragoza 2004 Hombres 441840
# 7 Huesca 2014 Mujeres 111069
# 8 Huesca 2004 Mujeres 104940
# 9 Teruel 2014 Mujeres 68916
# 10 Teruel 2004 Mujeres 68260
# 11 Zaragoza 2014 Mujeres 488436
# 12 Zaragoza 2004 Mujeres 455510
Si eso de datos largos (o en formato largo) no te suena, pierde un momento en:
format( "www.R-project.org", year = 2015)
Tal fue el asunto del correo en el que Martin Maechler anunció el lavado de cara de la página de R acontecido hace unos pocos días. Es muy revelador el argumento year = 2015
: los usuarios de hoy en día ya no toleramos caóticas yuxtaposiciones de cualquier cosa que algunos llaman páginas de internet.
Los usuarios de hoy en día no tenemos tiempo de buscar y rebuscar. Nos molestan los tropezones. Nos molesta la complejidad innecesaria.
¿Cuál es la "mejor" manera de ordenar un dataframe?
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?
Todos contra todos
¿Cómo se suman los cuadrados de un vector de números en un paradigma tradicional de programación? Se crea un bucle que lo recorre y que guarda las sumas parciales en un acumulador. Sumamente económico en términos de memoria: apenas consume unos pocos bytes en la pila. La versión funcional de la cosa se parece más a sum(x^2)
, que implica generar un vector de cuadrados y dilapidar memoria.
Así las cosas, en C uno tiende a recorrer y construir resultados parciales. R invita a crear estructuras de datos preprocesados y aplicar sobre ellas funciones resumen. Map y reduce, si se quiere.
Curso de presencial y gratuito en Madrid (mío, para más señas)
Voy a impartir un curso básico de R en Madrid. El curso es
- presencial (no habrá vídeo, retransmisión en streaming ni similares),
- gratuito (aunque mira las letra pequeña del final)
- no reglado, por lo que no se experidirán certificados, ANECAs o papeles de ningún tipo.
Se trata de un curso de introducción a R desde cero en cuatro sesiones de tres horas los martes (24 de febrero y 3, 10 y 17 de marzo) de 18:00 a 21:00. El programa de las sesiones es:
Recurrencia recurrente
Pregunta Antonio Sánchez Chinchón cómo mejorar la parte menos vistosa e imaginativa de esto, es decir, el código. Él, y muchos diríamos que correctamente, autocritica el uso de eval
+ parse
para plagar el namespace
de funciones.
La respuesta está en la recurrencia. He aquí mi versión del código:
library(ggplot2)
library(gridExtra)
nrows <- 6
coefs.a <- runif(min=1, max=50, nrows)
coefs.b <- runif(min=1, max=50, nrows)
foo.a <- sample(c(sin, cos), nrows, replace = TRUE)
foo.b <- sample(c(sin, cos), nrows, replace = TRUE)
foo <- function(x, a, b){
if(a == 1 || b == 1)
return(foo.a[[a]](coefs.a[a] * x))
if(b == a)
return(foo.b[[a]](coefs.b[a] * x))
foo(x, a-1, b) + foo(x, a-1, b-1)
}
vplayout = function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)
opts=theme(legend.position="none",
panel.background = element_rect(fill="gray95"),
plot.background = element_rect(fill="gray95", colour="gray95"),
panel.grid = element_blank(),
axis.ticks=element_blank(),
axis.title=element_blank(),
axis.text =element_blank())
grid.newpage()
jpeg(file="AddingWaves.jpeg", width = 1800, height = 1000,
bg = "gray95", quality = 100)
pushViewport(viewport(layout = grid.layout(nrows, 2*nrows-1)))
for (i in 1:nrows) {
for (j in 1:i) {
print(ggplot(data.frame(x = c(0, 20)), aes(x)) +
stat_function(fun = function(x) foo(x, i, j),
colour = "black", alpha=.75)+opts,
vp = vplayout(i, nrows+(2*j-(i+1))))
}
}
dev.off()
El resultado es
Ejercicios de mi clase de R
Ya conté que participo (como profesor) en el Experto en Data Science de la U-tad. Voy a copiar aquí los ejercicios que propuse en la asignatura de preparación de datos con R. Por si alguien les quiere hincar el diente. En lo que sigue he eliminado algunos detalles que no vienen a cuento. He dejado el resto.
Son así:
Los ejercicios tienen que resolverse individualmente. No son sencillos: parte de ellos están inspirados en problemas prácticos reales. Por eso puedes ayudarte de cualquier tipo de instrumento (Google, blogs, libros, etc.) que estaría a tu alcance en tu trabajo. Eso sí, en las soluciones que envíes, indica los recursos que utilices y deja clara cuál es tu aportación en cada caso.