2016-10-17

Substituir un elemento de una cadena de texto en R

Title

Problema

Dada una cadena de texto queremos substituir el elemento 'T' por 'U'.

v <- c("GATGGAACTTGACTACGTAAATT")
# Si importamos un fichero que contiene la cadena de texto
v <- readLines("rosalind_rna.txt")

Solución

Paquete base

gsub("T", "U", v)
[1] "GAUGGAACUUGACUACGUAAAUU"

Referencias

2016-10-15

Contar elementos únicos de una cadena de texto en R

Title

Problema

Dada una cadena de texto queremos contar el número de veces que aparecen los elmentos 'A', 'C', 'G', y 'T'.

v <- c("AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC")
# Si importamos un fichero que contiene la cadena de texto
v <- readLines("rosalind_dna.txt")

Solución

  • Paquete base
  • table(strsplit(v, NULL)[[1]])
    
    A  C  G  T 
    20 12 17 21 
    
  • Paquete stringr para la manipulación de cadenas de texto
  • library(stringr)
    # 1 - Elementos codificados a mano
    str_count(v, c("A", "C", "G", "T")) 
    # 2 - Extrae alfabéticamente elementos únicos
    str_count(v, sort(unique(strsplit(v, NULL)[[1]]))) 
    
    [1] 20 12 17 21
    

Referencias

2016-10-07

Obtener celdas cuadradas en lugar de rectangulares con geom_tile en ggplot2

Problema

Tenemos el siguiente gráfico cuyas celdas, creadas con geom_tile, son rectángulos. ¿Cómo conseguimos que sean cuadrados con ggplot2?

set.seed(1)
df <- data.frame(val = rnorm(100), 
                 gene = rep(letters[1:20], 5), 
                 cell = c(sapply(LETTERS[1:5], 
                                 function(l) rep(l, 20))))
library(ggplot2)
ggplot(df, aes(y = gene, x = cell, fill = val)) +
  geom_tile(color = "white")

Solución

Añadimos coord_equal( ). Por defecto, el argumento es ratio = 1, y asegura que una unidad en el eje x tenga la misma longitud que una unidad en el eje y.

ggplot(df, aes(y = gene, x = cell, fill = val)) +
  geom_tile(color = "white") +
  coord_equal()

Referencias

Entradas relacionadas

2016-10-04

Combinaciones de dos vectores contenadas y separadas por comas en R

Title

Problema

Queremos obtener todas las combinaciones de dos vectores contatenadas y separadas por comas.

pets <- c('dog','cat','lemur')
fruit <- c('banana','apple','papaya')
Y obtener el siguiente resultado:

[1] "cat, apple"    "dog, apple"    "lemur, apple" 
[4] "cat, banana"   "dog, banana"   "lemur, banana"
[7] "cat, papaya"   "dog, papaya"   "lemur, papaya"

Solución

  • Paquete base

levels(interaction(pets, fruit, sep = ', '))
Obtenemos un vector de 9 caracteres con las combinaciones separadas por coma y un espacio

Referencias

2016-09-21

Problema del conjunto de cobertura en R

Title

Problema

Queremos resolver el problema del conjunto de cobertura en R. Calcular el número mínimo de conjuntos necesarios que contenga todos los elementos del universo. En nuestro ejemplo el universo es U = {1, 2, 3, 4, 5} y los conjuntos son s1 = {1, 2, 3}, s2 = {2, 4}, s3 = {3, 4}, s4 = {4, 5}.

  sets n
1   s1 1
2   s1 2
3   s1 3
4   s2 2
5   s2 4
6   s3 3
7   s3 4
8   s4 4
9   s4 5

df <- structure(list(sets = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 
4L, 4L), .Label = c("s1", "s2", "s3", "s4"), class = "factor"), 
    n = c(1, 2, 3, 2, 4, 3, 4, 4, 5)), .Names = c("sets", "n"
), row.names = c(NA, -9L), class = "data.frame")

Solución

En nuestro ejemplo la solución es obvia, los conjuntos s1 y s4 serían el número de conjuntos mínimo necesario. Sin embargo, deseamos implementarlo en R para ser capaces de resolver problemas que comprendan miles de conjuntos con miles de elementos dentro de cada uno.

# El universo, elementos únicos de todos los conjuntos.
unique(df$n)
[1] 1 2 3 4 5
Empleamos el paquete lpSolve para resolver problemas de programación lineal.

# Creamos una representación matricial a partir del data frame
# Se asume que cada variable es  >= 0! (ver ?lp)
items.mat <- t(table(df$sets, df$n))
dimnames(items.mat) = list(items = 1:5, sets = paste0("s", 1:4))
items.mat
# Matriz
      sets
 items s1 s2 s3 s4
     1  1  0  0  0
     2  1  1  0  0
     3  1  0  1  0
     4  0  1  1  1
     5  0  0  0  1
f.obj <-  rep(1, 4)  # Valores de las variables de las inecuaciones
f.dir <- rep(">=", 5) # La cadena de texto de las restricciones por fila
f.rhs <- rep(1, 5)    # Los valores de la desigualdad por fila
lp("min", f.obj, items.mat, f.dir, f.rhs)$solution
[1] 1 0 0 1
La solución son los conjuntos s1 y s4 indicados por los coeficientes de las columnas: el 1º y el 4º.

Referencias

2016-09-19

Editar un bloque de texto vertical en Notepad++

Title

Problema

Queremos editar simultáneamente columnas en Notepad++. En el siguiente ejemplo, cambiaremos el campo name por id y le asignaremos la serie del 1 al 3.

Solución

  • Alt + Mayús + Cursor o ratón, o bien
  • Alt + Arrastramos el ratón

Entradas relacionadas

2016-09-07

VBA - Reemplazar la extensión de todos los ficheros de una carpeta

Title

Problema

Queremos reemplazar la extensión de todos los ficheros de una carpeta.

Solución

  1. Abrimos el Editor de Microsoft Visual Basic: Alt+F11.
  2. Copiamos el siguiente código.
  3. Sub CambiarExt()
    
        With CreateObject("wscript.shell")
           .currentdirectory = CurDir
           .Run "%comspec% /c ren *.xls *.xlsx", 0, True
        End With
    
    End Sub
    
  4. Guardamos el fichero Excel en la carpeta de destino, donde se encuentran los ficheros que deseamos cambiar.
  5. Ejecutamos el código: F5.

Notas

CurDir - Indica el directorio de destino en el que se realiza el reemplazamiento. Si deseamos otra ruta la especificamos entre comillas. Ej:"C:\Usarios\Carpeta\Excel pruebas\"
.Run "%comspec% /c ren - Ejecuta cmd.exe y renombra los ficheros.
*xls - En nuestro ejemplo el primer argumento del fichero, es la extensión actual de los ficheros.
*xls - En nuestro ejemplo el segundo argumento del fichero, es la extensión final o deseada de los ficheros.

Podemos indicar todo tipo de extensiones: *txt a *csv por ejemplo. Se trata tan sólo de un ejemplo muy sencillo al que podemos añadir otras funcionalidades: mediante mensajes de texto o desplegables en texto en los que el usuario pueda definir los parámetros anteriores.

Entradas relacionadas

2016-09-05

Convertir el tipo de objeto de todas las columnas de un data frame

Title

Problema

En R podemos usar las siguientes funciones para convertir el tipo de objeto de un vector a otro:

as.character(x)
as.complex(x)
as.numeric(x) or as.double(x)
as.integer(x)
as.logical(x)

Pero si deseamos convertir todas las columnas de un data frame, ¿qué podemos hacer?.

Solución

Tomamos como ejemplo el data frame mtcars al que le asignaremos el nombre df.

df <- mtcars
str(df)

'data.frame': 32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
  • Opción 1
  • df <- data.frame(lapply(df, as.character), stringsAsFactors = FALSE)
    
  • Opción 2
  • Más conicsa.

    df[] <- lapply(df, as.character)
    

Resultado

Ahora todas las columnas son del tipo carácter.

str(df)

'data.frame': 32 obs. of  11 variables:
 $ mpg : chr  "21" "21" "22.8" "21.4" ...
 $ cyl : chr  "6" "6" "4" "6" ...
 $ disp: chr  "160" "160" "108" "258" ...
 $ hp  : chr  "110" "110" "93" "110" ...
 $ drat: chr  "3.9" "3.9" "3.85" "3.08" ...
 $ wt  : chr  "2.62" "2.875" "2.32" "3.215" ...
 $ qsec: chr  "16.46" "17.02" "18.61" "19.44" ...
 $ vs  : chr  "0" "0" "1" "1" ...
 $ am  : chr  "1" "1" "1" "0" ...
 $ gear: chr  "4" "4" "4" "3" ...
 $ carb: chr  "4" "4" "1" "1" ...

Referencias

Nube de datos