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… listas de especies

Hola.

No se si recordáis aquella entrada en que os describía como hacer que R nos preguntara cunado cuando había encontrado un NA.

Pues hoy, en el Blog de Luis Cayuela, hay una entrada con un problema similar. Él tiene el problema a la hora de determinar, por ejemplo, si los nombres de las especies son correctos o si dos nombres diferentes corresponden a la misma especie.

Es interesante por que además nos ofrece información sobre una iniciativa interesante The Plant List que intenta poner en un solo lugar todos los nombres aceptados de plantas vasculares, con sus sinónimos, autorías, etc.

Espero que os sea útil.

Jaume.

Acerca de… Jornadas de ususarios de R

Hace ya más de una semana que terminaron y creo que es interesante hablar de ellas aquí.

Ya está diponible el libro de resumenes. Está muy bien por que junto al resumen te da la opción de ir a la ponencia.

Hay varias sobre ecología:

Algunas aplicaciones de R en ecología: de la docencia elemental a la investigación avanzada.

Marcelino de la Cruz Rot. Universidad Politécnica de Madrid.

Presentación

Detección de patrones espaciales de biodiversidad de árboles y mamíferos en la Península Ibérica.

Jennifer Morales Barbero, Rafael Francisco García Vázquez y Dolores Ferrer Castán. Área de Ecología, Universidad de Salamanca.

Presentación

Correcciones taxonómicas de grandes bases de datos de forma automatizada.

Luis Cayuela. Universidad Rey Juan Carlos.

Presentación

Además hay algunos sobre supervivencia que se podrían aplicar a algunos estudios ecológicos.

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… RStudio

Hola

Dicen que rectificar es de sabios. Ya voy por el tercer intermediario (GUI) para R.

Todo empezó con el JGR, necesitaba hacer el uso de R un poco más fácil en linux (vedlo aquí y aquí)

La verdad es que no iba demasiado bien y era un lío trabajar de dos formas diferentes en linux y Windows. Traté de buscar uno que funcionara en ambas plataformas y apareció el RKWard. Va bastante bien pero en windows da algunos problemas a la hora de generar los gráficos en formatos vectoriales. Y el asunto de las actualizaciones tampoco es trivial.

Pero el otro día vi a un colega usando RStudio. Yo no dejaba el RKward por que te marca la sintaxis con colorines y te sugiere a medida que escribes. Pero el RStudio hace eso y mucho más, además funciona en Windows y Linux. Y la cuestión es que va suave, da una sensación de maquina bien engrasada. El tema de las actulizaciones tampoco es automático, pero no va mal, ya os contaré.

Pues eso probad el RStudio.

jaume

Acerca de… hacer que R nos pregunte

Hola,

A veces cuando estamos analizando datos, nos salen resultados raros que nos hacen revisar los dataframes en busca de pequeños errores. Normalmente estos errores son cosas sistemáticas producidas por la importación de los datos, valores perdidos, etc. que se pueden solucionar fácilmente con replace() o cosas así. Pero a veces cada pequeño error necesita que lo revisemos y tomemos una decisión.

Aquí os presento una cosa que he descubierto par enfrentarme a ese problema… bueno, supongo que los erreros añejos lo tiene superado. La cosa es esta, tengo información sobre una serie de especies que aparecen o no en unas parcelas. De otra base de datos he obtenido si dichas especies son anuales o perennes, pero no todas las especies de mi dataframe están en la base de datos, así que me quedan especies con NA. Pero necesito ir especie a especie confirmando si es a o p. Lo que he hecho es esto:

Mis datos:

Spxparc<-data.frame(especie=c(rep("sp1",5),rep("sp2",4),rep("sp3",2),rep("sp4",5),rep("sp6",4))
                   ,parcela=c(c(1:5),c(1:4),c(1,2),c(1:5),c(1:4))
                   ,anuper=c("a","p",NA,"a","p",rep("a",10),NA,NA,NA,NA,NA)
                   )

Lo que quiero es que R vaya de NA en NA y me pregunte:


#para cada fila del df
for(i in c(1:nrow(Spxparc)))
{
  #si en esa fila anuper es NA
  while(is.na(Spxparc$anuper[i]))
  {
    #enseñale al usuario a que especie corresponde
    print(Spxparc$especie[i])
    #pidele al usuario que te diga si esa especie es a o p
    input<-scan(n=1,what="character")
    #escribe lo que te diga el usuario en la tabla
    Spxparc$anuper[i]<-input
  }
}

Esto es todo. Espero que os sea útil.

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… Actualizar el R de RKward en Windows.

Hola,

He instalado RKward en Windows. De momento va bastante bien.

Podéis descargar un ejecutable aquí. Buscad en downoload y en windows instaler.

El problema que he encontrado es que no se como actualizar el R que viene con el RKward.

Lo que he hecho es instalar la última versión de R (para windows) en la carpeta que crea el RKward. Dentro de esa carpeta hay una subcarpeta llamada R y otra llamada KDE. Renombramos la carpeta del R como Rold y la carpeta de la nueva versión como R, así el Rkward irá a buscar a la carpeta de la nueva versión. Pero en esta nueva versión no están los paquetes que usa Rkward ni los que hemos instalado anteriormente. Lo que hay que hacer es copiar las subcarpetas de la carpeta lib de Rold a la carpeta lib de R llevándonos con nosotros todos los paquetes instalados anteriormente.

Bueno, parece que funciona.

Ya sabéis, sugerencias, ideas, quejas aquí abajo.

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.