Merge de GRanges

Al trabajar con la librería Genomic Ranges de R, y sus listas de objetos de tipo GRanges, nos puede interesar de juntar listas de GRanges.

A priori, al parecer un formato tipo data.frame o arrays, uno intenta usar cbind() y rbind() pero vemos que R nos da un error porque no se pueden usar esas funciones para objetos GRanges.

Pues resulta, que al final una lista de objetos GRanges no es más que un vector. Por lo que para unir listas de GRanges tenemos que hacerlo con la función c() de R.

Para añadir la lista que tenemos en grReduced a la lista resultados, habríamos:

Pasar de un data.frame a GRanges

La librería GenomicRanges ofrece una función para convertir un data.frame en un objeto de tipo GRanges, de forma rápida y sencilla: makeGRangesFromDataFrame()

Tenemos un dataFrame, en este caso con una lista de genes, por lo tanto, representando rangos de datos:

A partir de este objeto vamos a crear un objeto GRanges para poder trabajar de forma más cómoda sobre esta lista de genes, aprovechando funcionalidades de la librería GenomicRanges.

La sintaxis es sencilla:

Vemos que le pasamos en el parámetro df el objeto data.frame que contiene la información que queremos convertir en GRanges.

Los siguientes campos son para indicar cromosoma, inicio de rango, final de rango, tipo  (en caso que no nos interese, podemos obviarlo, y añadir el parámetro ignore.strand=TRUE), y el último parámetro, keep.extra.columns lo ponemos a TRUE para que nos mantenga el resto de información asociada a cada uno de los rangos.

 

Modificar librería de R

Si nos bajamos un paquete de R, veremos que el código fuente está formado por distintos archivos. Lo más habitual serán archivos con extensión .R, donde estarán definidas las funciones de R que nos aporta esa librería.

Modificar código R de una librería de R

Hacer cambios a esa librería será tan sencillo como modificar el fichero .R, hacer pruebas usando la función source(), y reinstalar la librería  (como veremos más adelante) cuando queramos hacer definitivos esos cambios.

Modificar código C de una librería de R

En otros casos, los paquetes de R tienen parte programada en otros lenguajes, como por ejemplo en C.

Vamos a ver cuál sería la forma de trabajar con ese código en C para modificarlo según nuestras necesidades.

Mientras estamos modificándolo, nos interesará hacerlo de una forma sencilla y rápida, que no nos obligue a reinstalar la librería a cada cambio que queramos hacer en el código en C.

Para hacer eso, R dispone de CMD SHLIB, que nos permite compilar ese código de C, generando un archivo que podemos cargar instantáneamente sobre R, desde donde podremos llamar a las funciones modificadas de C.

Vemos como usamos CMD SHLIB:

Esto nos generará un fichero con extensión .so (en mi caso, qADM.so).

Una vez tenemos el fichero .SO, podemos cargarlo directamente al R, para tener acceso a esas funciones de C. La forma de hacerlo es usando la función dyn.load(), desde la propia consola de R:

Una vez hecho esto, en nuestra sesión de R tendremos disponibles las funciones definidas en qADM3.c, con los cambios que hayamos aplicado.

Reinstalar librería para aplicar cambios

Una vez hemos hecho cambios en el código de la librería, ya sean en R o en C, y ya los hemos probado usando dyn.load(), tendremos que volver a instalar la librería para que estos cambios queden aplicados de forma definitiva sobre la librería.

Vamos a instalar un paquete que tenemos en una carpeta llamada qADM:

Una vez hecho esto, si ya tenemos una sesión de R abierta, y con la librería cargada (en su versión anterior), tendremos que volver a cargarla para actualizar así a la última versión instalada. Si no lo hacemos, seguiremos usando la versión anterior.

El usuario importa!

Recuerda que el usuario con que se ejecutan estos comandos importa, ya que R instalará esa librería en el repositorio por defecto de ese usuario.

En mi caso yo lo he hecho como root, y no con mi usuario. En el caso del root, se instala en el repositorio general del sistema. Por lo tanto, si te interesa que cualquier usuario del sistema pueda hacer uso de esa librería, tienes que hacer la instalación del paquete con el usuario root.

En mi caso, de hacerlo con mi propio usuario, el lugar donde instala el paquete es en  ~/R/i486-pc-linux-gnu-library/3.1/qADM/libs.

 

Error al instalar librería XML de R

Al instalar la librería “XML” de R en un Ubuntu Server, ya sea mediante:

o desde la línea de comandos mediante:

el proceso no se completa, dando el siguiente error:

Solución:

Para poder instalar y ejecutar el package XML de R, hace falta el paquete libxml2-dev, por lo que lo instalaremos mediante apt-get:

Después de esto, volvemos a provar de instalar, desde la consola de R:

y el proceso se completa sin ningún otro problema.

Sustituyendo patrones de texto

Tenemos esta columna con estos valores:

Queremos dejar el nombre del síndrome sin el prefijo disorderType, y quitar los %20 para que queden espacios limpios.
Usaremos gsub()para hacer sustituciones. Le pasamos tres parámetros, el primer es el patrón a buscar, el segundo el patrón por el que sustituiremos el patrón encontrado, y el tercero, la variable donde aplicar estas sustituciones.

Procedemos primero a eliminar el prefijo:

Y después a sustituir los %20 por espacios en blanco:

Básicos para leer XML con R

Algunas funciones del package XML de R, que nos facilita el trabajo a la hora de extraer información de un fichero XML.

Cargar en memoria fichero xml

Si el valor de xmlMalaltia es este:

Operador [[]] para navegar por los hijos

Valor de un nodo, función xmlValue()

Valor de un atributo de un nodo, función xmlGetAttr()

Lista de atributos de un determinado nodo, función xmlAttrs()

XPath

Esto que hemos visto serían las funciones más básicas para obtener valores de un nodo dado. Pero lo más útil, por lo menos en mi caso, es el poder usar XPath para hacer búsquedas dentro del fichero XML y movernos hacia arriba o hacia abajo de un determinado nodo. Es una herramienta bastente potente y versátil.

Valor de un determinado hijo:

Este es un caso muy sencillo, en el que no tendría demasiado sentido el uso de xPath. Respecto la variable xmlMalaltia, se busca entre sus hijos el nodo

Todos los nodos con un determinado nombre:

Esto nos devolverá, del xml de la variable xmlDiseases, una lista con todos los nodos que tengan por nombre ‘Disorder’, esten en el nivel que esten.

Todos los nodos con un determinado nombre y un determinado atributo:

En este caso, queríamos el nombre (tag Name), tal que su padre (con tag Disorder) tiene un atributo id que tiene por valor 5441. getNodeSet, nos devolvería una lista. Como sabemos que nos devolverá solo un elemento, lo cogemos con el [[1]] del final. El parámetro fun, es la función que ejecutará para cada valor de la selección, y el valor que nos devolverá (tipo función apply de R).

Otro ejemplo similar al anterior, en el que sí nos interesa la lista de nodos xml, por lo que no ejecutamos xmlValue:

Todos los subnodos con un determinado Tag:

En este caso obtenemos todos los nodos con nombre Disorder, que esten por debajo del padre de xmlMalaltia.

Aquí vemos que los dos puntos (..) en el path, sirven para subir un nivel en la jerarquia del nodo actual (xmlMalaltia).

Vemos tambien el uso de expresiones xPath Axes, que nos devuelven nodos relacionados con nuestro nodo actual. En este caso, todos los descendentes  del nodo actual, mediante la palabra descendant. Tenemos otras palabras útiles de Axes como ancestor, child, etc.  (lista completa de xPath Axes en w3schools: http://www.w3schools.com/xpath/xpath_axes.asp).

Parámetros adicionales a función llamada con sapply

Tenemos una función a la que queremos llamar para cada uno de los objetos de una lista. Para hacerlo de forma eficiente lo queremos hacer con sApply(), y no haciendo un for() o un while(). La función a la que queremos llamar, además del propio objeto sobre el que se hace la llamada, tiene un segundo parámetro que tenemos que pasar.

Esta es la función en cuestión:

De los dos parámetros, el primero se lo pasará la función sApply, y será uno de los elementos de la lista de sApply. Pero el segundo parámetro, cómo se lo pasamos?

La función sApply (o simplemente apply, o sus derivadas), tiene el parámetro ‘…’, por lo que acepta en su llamada cualquier parámetro adicional no especificado en la lista formal de parámetros. Todos estos parámetros adicionales que pasemos, apply los pasará directamente a la función llamada. Por lo que, podemos hacer la llamada a sApply añadiendo el parámetro idDisease de la forma:

SApply() pasará este valor como parámetro idDisease de la función ancestorsFunction().

Convertir una variable de tipo factor (R) a numérica

A veces nos encontramos variables que representar valores porcentuales, con el símbolo de porcentaje, y guardados como factor. Si queremos hacer gráficos exploratorios, seguramente nos interesará tener estos valores como valores numéricos.

Por ejemplo, tenemos una variable que estos son sus 10 primeros valores:

Nos interesa pasarlo a numeric:

Con lo que si volvemos a listar los 10 primeros valores:

Usando librerías externas con R

Antes de poder utilitzar funciones de una librería o package que no forma parte del core de R, tenemos que cargarlo.

Función para cargar librería externa

En este caso, vemos que nos da un mensaje de error porque no encuentra el package ‘ElemStatLearn’. El motivo es porque no hemos descargado previamente esta librería a nuestro PC. Por lo que tendremos que descargarla antes de poderla cargar.

Descargar un package

Ahora ya sí que podremos cargar la librería sin ningún problema, con la función library()como hemos dicho antes:

 

 

Split para separar en dos una columna en R

Tenemos una tabla con dos columnas, una de las cuales queremos separar en dos basándonos en el delimitador “:” es decir, queremos tener en una columna la parte anterior al delimitador, y en la otra columna la parte posterior.

Datos originales:

Ejecutamos la siguiente sentencia:

Dando por resultado: