Acerca de… Anuncio de las IV Jornadas de Usuarios de R

Pues eso, os pego el anuncio que han colgado en la lista de usuarios de R.

«Escribo en nombre de los comités organizador y científico de las IV
Jornadas de Usuarios de R para anunciarlas pública y oficialmente.
Tendrán lugar los días 15 y 16 de noviembre en el CREAL
(http://www.creal.cat/), Barcelona y está coorganizadas por el CREAL,
el Grupo de Usuarios de R de Barcelona y la Comunidad R Hispano.

Toda la información necesaria para participar y registrarse está disponible en

http://www.r-es.org/IV+Jornadas

Quiero invitar a todos a acudir, participar y difundir la noticia de
esta nueva edición de las Jornadas de Usuarios de R. Aprovecho también
la ocasión para agradecer la labor de quienes las han hecho posible y
saludar y recordar a quienes colaboraron en las ediciones anteriores.»

Por cierto, podéis suscribiros a la lista aquí.

Más información sobre usuarios de R en español aquí.

jaume.

Acerca de… NA’s, valores perdidos.

Hola

Aun recuerdo como me ilusionó saber que si dentro del paréntesis de la media pones na.rm=T el R pasa de los NA.

> v<-c(1,2,3,NA,4)
> mean(v)
[1] NA
> mean(v,na.rm=T)
[1] 2.5

Por que esto es muy cómodo, de hecho lo puedes meter en tu propia función para la media:


# datos de ejemplo
> coches<-cars
# metamos un NA
> coches[10,1]<-NA
# la media
> apply(coches,MARGIN=2,FUN=mean)
speed  dist
NA 42.98
# nuestra función
> mimedia<-function(x) mean(x, na.rm=TRUE)
> apply(cars,MARGIN=2,FUN=mimedia)
speed  dist
15.40 42.98

Y meter la función mimedia donde te de la gana.
Así podia deshacerme de los puñeteros NA que no sabía muy bien de donde venian ni para que servian.

Claro, con el tiempo uno aprende que los NA dependiendo de donde vengan pueden significar cosas muy distintas y que a veces podemos ignorarlos.
Pero a veces conviene convertirlos en un valor interesante.

coches[is.na(coches)]<-"valorinteresante"

O borrarlos:

coches<-cars
coches[10,1]<-NA
coches.sin.na<-coches[!is.na(coches$speed),]

Esto viene a cuento de esta entrada donde explica como son los NA según de donde vengan. Sabiendo eso podemos trabajar de una forma u otra. Ya que a veces la distribución de los NA puede estar sesgada y entonces no vale borrarlos o ignorarlos.

jaume

Acerca de… si es que el R sirve para todo.

En el blog sobre ecología y evolución EBB Flow. Nos han felicitado Halloween con una tarjeta hecha en R.

Os pego el código:


###required libraries
##if you do not have the "fields" and "MBA" libraries, you need this step to install them
install.packages("fields")
install.packages("MBA")
## load libraries
library(fields)
library(MBA)

###data
data<-matrix(c(44.9186,81.0824,46.9512,80.1061,49.187,80.7055,57.9268,80.1493,60.3659
 ,81.34,69.3089,80.1941,78.4553,79.2459,91.8699,70.834,99.7967,55.9047
 ,101.2195,30.9102,96.1381,17.3075,85.5691,7.4235,74.3902,4.2299
 ,61.7886,1.8181,55.4878,1.0059,49.187,0.9811,45.3252,1.7532,37.1951
 ,1.9181,20.3252,7.1666,8.9431,17.1612,4.2683,29.1507,4.2683,50.8042
 ,9.5528,66.3761,18.4959,76.2539,29.065,80.6261 ,38.6179,80.8607
 ,44.9186,81.0824)
 ,ncol=2,byrow=TRUE)
stem<-matrix(c(60.3659,81.34,57.9268,80.1493,49.187,80.7055,46.9512,80.1061,44.9186
 ,81.0824,45.5285,83.6438,47.561,88.1794,44.1057,97.2209,48.7805,99.9952
 ,54.878,87.6176,60.3659,81.34)
 ,ncol=2,byrow=TRUE)
eye<-matrix(c(45.935,46.4407,34.1463,44.8195,36.7886,46.9952,36.382,50.9306,32.3171,53.08
 ,29.065,53.0672,26.0163,49.7086,28.0488,45.1892,20.3252,48.7021,20.1219
 ,55.3942,23.5772,61.1164,30.8942,65.476,32.3171,59.7729,45.935,46.4407)
 ,ncol=2,byrow=TRUE)
eye2<-matrix(c(58.9431,46.6888,65.4472,51.2419,71.748,56.9754,74.3902,65.4504,82.7236
 ,59.7745,84.9593,56.4368,84.7561,48.562,77.439,45.7772,78.8618,50.5072
 ,74.3902,53.6393,69.9186,51.6532,68.6992,47.9083,70.5285,44.9627,58.9431
 ,46.6888)
 ,ncol=2,byrow=TRUE)
mouth<-matrix(c(8.9431,44.7202,23.374,41.2338,30.0813,22.7562,38.2114,38.5363,65.0407
 ,38.445,73.374,22.533,80.2846,40.8673,96.9512,44.673,93.4959,31.8641
 ,84.1463,18.8352,66.2602,9.7097,61.9919,16.1889,59.3496,8.3045,45.5285
 ,8.447,42.8862,16.1137,38.2114,9.4024,22.7642 ,17.4125,11.9919,31.7401
 ,8.9431,44.7202)
 ,ncol=2,byrow=TRUE)
stars<-matrix(c(sample(seq(0,100),80),sample(seq(20,100),80,replace=TRUE)),ncol=2)

###plot
par(bg = "black")
par(mar=c(5,2,4,2))+0.1
plot(data,type="n",xlim=c(0,100),ylim=c(0,100),xaxt="n",yaxt="n",xlab="",ylab="",axes=FALSE)
symbols(x=stars[,1],y=stars[,2]
 ,circles=rep(0.001,nrow(stars))
 ,inches=0.015,bg="white"
 ,xlim=c(0,100),ylim=c(0,100))
col<-runif(nrow(data),min=4,max=7)
datmb<-mba.surf(matrix(cbind(data,col),ncol=3),no.X=200,no.Y=200,extend=FALSE)
image(datmb$xyz,zlim=c(0,10),col=heat.colors(40),add=TRUE)
polygon(stem,col="darkgreen")
polygon(eye,col="yellow")
polygon(eye2,col="yellow")
polygon(mouth,col="yellow")
points(data,type="l")
mtext("Happy Halloween",side=3,col="green3",cex=3.5,font=4)
mtext("from the EEB and Flow",side=1,col="green3",cex=2.5,font=4)

Ale, a destriparlo y a aprender cosas sobre gráficos en R.

No os perdáis el segundo comentario.

jaume

Acerca de… reemplazar valores en un vector en R

Hola.

Para sustituir elementos de un vector por otra cosa usamos

> replace()
> datos<-c("a1","a2","b1","b2","c1","c2","c3","a3","b3")
> datos
[1] "a1" "a2" "b1" "b2" "c1" "c2" "c3" "a3" "b3"
> replace(datos,datos=="c1"|datos=="c2"|datos=="c3","c")
[1] "a1" "a2" "b1" "b2" "c"  "c"  "c" "a3" "b3"

ojo, hay que asignar el resultado a algo, si no el resultado se queda en el limbo:

> datos.n<-replace(datos,datos=="c1"|datos=="c2"|datos=="c3","c")

Esto quiere decir: En el vector datos pon «c» en los lugares de datos que haya c1, c2 o c3.
Pero si datos fuera un factor…

> datos.f<-as.factor(datos)
> datos.f
[1] a1 a2 b1 b2 c1 c2 c3 a3 b3
Levels: a1 a2 a3 b1 b2 b3 c1 c2 c3

… y intentamos reemplazar por algo que no es uno de los niveles del factor nos hace perla.

> datos.n<-replace(datos.f,datos.f=="c1"|datos.f=="c2"|datos.f=="c3","c")
Mensajes de aviso perdidos
In `[<-.factor`(`*tmp*`, list, value = "c") :
invalid factor level, NAs generated

Lo que hay que hacer (lo que hago yo, mejor dicho) es convertir el factor en carácter o número o lo que sea  hacer el replace().

> datos.f<-as.character(datos.f)
> datos.n<-replace(datos.f,datos.f=="c1"|datos.f=="c2"|datos.f=="c3","c")
> datos.n
[1] "a1" "a2" "b1" "b2" "c"  "c"  "c"  "a3" "b3"

No olvidemos hacer el resultado factor de nuevo.

> datos.n<-as.factor(datos.n)

Recordad que los datos pueden ser vectores, filas o columnas de una matriz, filas o columnas de un dataframe, etc.

Pero qué pasa si queremos reemplazar por los valores de otro vector.

Supongamos que queremos reemplazar números por las letras del abecedario que hay en las posiciones que indican esos números (a-1, b-2, c-3, etc.)

Nuestros datos serian un vector de números

> datos<-c(1,2,5,7,3)
> datos
[1] 1 2 5 7 3

Y queremos que en cada numero R nos escriba la letra que está en esa posición en el abecedario.

Escribimos el abecedario

> abecedario<-c(letters)
> abecedario
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m"
[14] "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

Asignamos nombres al vector del abecedario, pero ojo que sean character.

> names(abecedario)<-as.character(c(1:length(abecedario)))
> abecedario
1   2   3   4   5   6   7   8   9  10  11  12  13  14
"a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
15  16  17  18  19  20  21  22  23  24  25  26
"o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

Hacemos un bucle.

> salida<-0
> for(x in 1:5) { salida[x]<-abecedario[names(abecedario)==datos[x]] }
> salida
[1] "a" "b" "e" "g" "c"

para cada valor de x (1-5) va a la posición x (1-5) del vector salida y le asigna el valor del vector abecedario cuyo nombre es igual al  valor del vector datos en la posición x.

Bueno, esto funciona, pero tengo un escozor en el cogote que me dice que podría ser mucho más sencillo.

Espero que os sea útil. Ya sabéis, las ideas, quejas y comentarios son bienvenidos.

jaume

Acerca de… rkward.

Hola,

editado 27/10/2011: Mirad esta entrada.

Estoy empezando a utilizar una nueva interfaz gráfica para R en linux. Se llama RKward y va bastante mejor que JGR.

A pesar de ser para KDE va muy bien el Ubuntu, se instala directamente con el Añadir y Quitar de Ubuntu y no necesita un montón de librerias de KDE para funcionar. Además en su web en forma de wiki esta todo bastante bien explicado.

Puedes ver gráficamente lo que tienes en el Workspace,  tiene la opción de autocompletar con el tabulador, puedes buscar en la ayuda de forma gráfica, etc.

Una vista del RKward funcionando en Ubuntu.

Ya iré colgando cositas.

Saludos.

Acerca de… letras y ubunutu

Hola,

Dos cositas interesantes.

Llamar a las letras griegas por su nombre.

La verdad es que es una cosa que nunca he sabido y cada profesor decía una cosa diferente. Aquí podéis encontrar una entrada en un blog sobre el tema. Es un señor que se ve que ha vivido en Atenas y se ha molestado en escribirnos los nombres adecuados de las letras griegas.

Así que vayamos ovidándonos de llamar a esto μ «mu» por que se dice mi. Y nada de Chi cuadrado, sino Ji cuadrado.

Después de instalar Ubuntu.

Echadle un ojo a esta entrada. Este señor se ha apuntado todo lo que hay que hacer después de instalar Ubuntu. Muy útil.

Solo le falta una cosa, instalar y actualizar el R, jeje, eso se puede ver aquí.

Saludos.

P.D.: Ya está corregido el enlace a la web de lo que hay que hacer después de instalar Ubuntu. Gracias Eloi.