Cómo reordenar niveles de factores en R

En esta entrada voy a mostrar tres maneras (que vienen a ser la misma) de ordenar los niveles de un factor en R: La básica La sofisticada El atajo Antes, responderé a una pregunta: ¿por qué reordenar niveles en factores? La mejor respuesta que se me ocurre: si no la sabes, deja de leer ya. Te aseguro que, a poco que trabajes con R, acabarás retomando la lectura. La forma básica es la siguiente: ...

15 de febrero de 2011 · Carlos J. Gil Bellosta

Rudimentos para la manipulación de fechas con R

Puede que a alguien le resulte sencillo, pero jamás ameno: trabajar con fechas y horas es, cuando menos, una molestia con cualquier lenguaje de programación. Y como mi compañero Raúl ofreció en su bitácora una pequeña guía de cómo operar con ellas usando SAS/WPS, me dispongo yo a hacer lo propio con R. Leyendo fechas y horas: strptime El primer encontronazo con el insidioso problema de las fechas y las horas suele ser el tener que leerlas de algún fichero de texto. En tales casos la función strptime siempre es útil: ...

2 de febrero de 2011 · Carlos J. Gil Bellosta

¿Es Cobol tan robusto como cuentan?

El diario El País se ha hecho eco de algo que no hace falta ser particularmente perspicaz para advertir. Y no me refiero tanto a la tesis global del artículo como a este parrafito, […] ambos opinan que la primera disfunción está en la Universidad. “Estamos hablando de trabajadores sobreeducados que, sin embargo, carecen de las habilidades necesarias para desempeñar el trabajo”. Este contrasentido está en relación directa “con el tipo de docencia impartida en las Universidades”, añaden. “Los graduados se quejan de que los modos de enseñanza se siguen basando en clases magistrales, dándole poca importancia a las clases prácticas a la adquisición directa de experiencia laboral”. Esta formación academicista, exenta de habilidades prácticas, es el factor que más influye, según el estudio, […] ...

30 de diciembre de 2010 · Carlos J. Gil Bellosta

La función monotonic de PROC SQL de SAS

Previamente he hablado en este blog de las ventajas que ofrece PROC SQL en SAS sobre otros métodos más propiamente SAS de realizar ciertas manipulaciones de datos. Existen no obstante cierto tipo de manipulaciones que exigen pasos data: gran parte de las que hacen uso de la variable automática n. No obstante, existe una función no documentada de SAS que permite implementar con SQL muchas operaciones de este tipo: monotonic. ...

11 de noviembre de 2010 · Carlos J. Gil Bellosta

Comportamiento inesperado... ¿sólo por mí?

El otro día, bajo el encabezamiento Unexpected behaviour of min, tapply and POSIXct/POSIXlt classes?, mandé a la lista de desarrolladores de R el siguiente pedazo de código: before <- Sys.time() Sys.sleep( 1 ) now1 <- now2 <- Sys.time() my.times <- c( before, now1, now2 class( my.times ) ## [1] "POSIXct" "POSIXt min( my.times ) ## [1] "2010-10-28 18:52:17 CEST" ### So far, so good... but: my.period <- c( "a", "b", "b" ) tapply( my.times, my.period, min ) ## a b ## 1288284737 1288284780 ## Where did my POSIXct class go? my.times.lt <- as.POSIXlt( my.times min( my.times.lt ) ## [1] "2010-10-28 18:52:17 CEST"; good tapply( my.times.lt, my.period, min ) # $a # [1] 17.449 # # $b # [1] 52 # # Mensajes de aviso perdidos # In ansmat[index] <- ans : # número de items para sustituir no es un múltiplo de la # longitud del reemplazo # # ¿? :( Invito a mis lectores a lo siguiente: ...

2 de noviembre de 2010 · Carlos J. Gil Bellosta

¿Siete lenguajes de programación emergentes?

Hace un par de días apareció un artículo en InfoWorld en el que se enumeraban siete lenguajes de programación emergentes. Parece que por emergentes ha de entenderse cada vez más extendidos en la empresa. Como R hacía parte del rol, comencé alegrándome. Después me surgieron dos elementos de sospecha. Véase la lista de los siete lenguajes seleccionados: Python, un viejo conocido. Ruby Matlab JavaScript, que está gozando de una segunda primavera gracias a AJAX y demás R, ¡cómo no! Erlang (vale la pena echarle un vistazo: tiene cosas la mar de interesantes) Cobol (¡ufa!) Extensiones CUDA Los elementos de sospecha son dos (ni tres ni siete): ...

27 de octubre de 2010 · Carlos J. Gil Bellosta

Rutinas de C en R

[Nota: esta entrada está totalmente desactualizada y la mantengo en blog por una mezcla de sentimentalismo y fidelidad a la “memoria histórica”; el interesado en cómo interconectar R y C (o C++) hoy hará bien en buscar en otra parte.] Esta entrada que ahora hago es un pequeño tutorial que publiqué en mi primera página de internet a principios de siglo, cuando todavía usaba Windows regularmente. Es posible que gran parte de lo que en ella cuente esté ya mandado a recoger. No obstante, tampoco hace tanto, eché mano de lo que en ella había dejado escrito para ver cómo migrar a Windows algo que había hecho en Linux y… todavía funcionó. ...

26 de septiembre de 2010 · Carlos J. Gil Bellosta

Una tarea para mis lectores: ¡resultados!

El otro día dejé planteada una tarea para mis lectores (que han sido menos diligentes que yo, incluso). Trataba de una comparación entre varios métodos para acceder a diccionarios (o hashes) de datos desde R para tratar de identificar el más eficiente en términos de velocidad de acceso. Acá van los resultados: n <- 100000 dat <- data.frame( id = paste( "id", 1:n, sep = "_" ), valor = rnorm( n ), stringsAsFactors = F ) n.sample <- 20000 seleccion <- sample( dat$id, n.sample ) ### Con vectores: system.time( res <- sapply( seleccion, function( x ) dat$valor[ dat$id == seleccion ] ) ) # user system elapsed # 84.79 5.24 90.14 ### Con listas: mi.lista <- sapply( dat$valor, I, simplify = F ) names( mi.lista ) <- dat$id system.time( res <- sapply( seleccion, function( x ) mi.lista[[x]] ) ) # user system elapsed # 19.15 0.00 19.20 ### Con entornos: mi.entorno.0 <- new.env() invisible( sapply( 1:n, function(i) assign( dat$id[i], dat$valor[i], env = mi.entorno.0 ) ) ) system.time( res <- sapply( seleccion, function( x ) mi.entorno.0[[x]] ) ) # user system elapsed # 67.89 0.03 68.06 ### Con el paquete data.table: require( data.table ) tmp.dat <- dat tmp.dat$id <- factor( tmp.dat$id ) mi.data.table <- data.table( tmp.dat ) setkey( mi.data.table, id ) system.time( res <- sapply( seleccion, function( x ) mi.data.table[ J(x) ]$valor ) ) # user system elapsed # 371.07 25.91 400.39 ### Con hashes: mi.entorno.1 <- new.env( hash = T ) invisible( sapply( 1:n, function(i) assign( dat$id[i], dat$valor[i], env = mi.entorno.1 ) ) ) system.time( res <- sapply( seleccion, function( x ) mi.entorno.1[[x]] ) ) # user system elapsed # 0.14 0.00 0.14 Los números son tan concluyentes que me excusan de la necesidad de ofrecer explicaciones y distingos. Aunque para que mis lectores no tengan que ir subiendo y bajando por la entrada para realizar comparaciones, los resumo en un gráfico: ...

6 de septiembre de 2010 · Carlos J. Gil Bellosta

El paquete multicore de R

Tengo acceso a una máquina que, aunque anda un poco corta de memoria, cuenta con ocho CPUs. Tenía unas simulaciones bastante pesadas que correr y quise aprovechar su naturaleza perfectamente paralelizable. Y, de paso, hacer con R lo mismo por lo que he visto a un consultor de SAS cobrar a razón de 3.000 dólares diarios. En el fondo, es una trivialidad. Supongamos que la función que implementa la simulación se llama foo. Habitualmente, haríamos ...

1 de septiembre de 2010 · Carlos J. Gil Bellosta

Una tarea para mis lectores

Ayer me dieron los resultados de unos análisis de sangre y, contra todo pronóstico, la médica me dijo que tengo el colesterol bajo control. ¡Con razón —me dije—, si en el blog lo hago yo todo! Así que para mejorar la circulación sanguínea de mis lectores, esta entrada es un ejercicio para quienes me leen. Espero pues que, a pesar de lo vacacional de las fechas, tengan tiempo de completar lo que queda sin hacer y lo hagan constar —antes de que pase lista— en un comentario explicando sus averiguaciones. ...

17 de agosto de 2010 · Carlos J. Gil Bellosta