Cadenas de caracteres

Las cadenas de caracteres, como se introdujo en Variables, objetos atómicos y operadores, son una secuencia de caracteres cuya creación necesita que sean introducidos entre comillas. A continuación, se explica el tratamiento de estas cadenas y, para ello, se requiere el paquete stringr, el cual está contenido en la biblioteca tidyverse instalada en Conceptos básicos, donde también se indica cómo se carga una biblioteca (library()).

Creación de cadenas con elementos funcionales

Las comillas para crear las cadenas de caracteres suelen ser dobles aunque, si se quiere introducir dicho símbolo como elemento de la cadena, se emplean comillas simples. Otro modo de incorporarlas sería incluyendo una barra invertida (\). Esto también se puede aplicar en el caso contrario, cuando se utilizan las comillas simples y se quiere introducir dicho símbolo también como elemento. La barra invertida es utilizada entre otras cosas para indicar, por ejemplo, saltos de línea o tabulación de la siguiente forma, respectivamente: \n y \t. Cuando aparecen elementos que realizan funciones como el salto de línea, el vector lo interpreta como caracter, aunque se puede ignorar mediante la función writeLines().

Ejemplos

1
2
3
4
cadena1 <- "Cadena realizada por estas comillas: \", apreciables como elemento gracias a \\" 
writeLines(cadena1)
cadena2 <- c("cadena1","\n","cadena2")
writeLines(cadena2)

Manipulación de cadenas

El paquete stringr contiene diversas funciones que también podrían llevarse a cabo con funciones de la biblioteca base que se incluye de forma predeterminada en la instalación de R. Mostramos algunas de ellas en la siguiente tabla:

base stringr Función
nchar() str_length() Tamaño de la cadena
gsub() str_replace() Reemplaza un elemento por otro
strsplit() str_split() Devuelve una lista con los componentes separados de la cadena

Ejemplo

1
2
3
4
5
6
7
8
library("stringr")
tamaño_cadena1A <- nchar(cadena1)
tamaño_cadena1B <- str_length(cadena1)
cadena1_reemplA <- gsub("por", "con", cadena1)
cadena1_reemplB <- str_replace(cadena1, "por", "con")
cadena1_reempl_all <- str_replace_all(cadena1, c("por"="con", "estas"=""))
cadena1_sepA <- strsplit(cadena1, " ")
cadena1_sepB <- str_split(cadena1, " ", simplify = TRUE)

Info

  • La función str_replace_all() permite realizar múltiples reemplazos.
  • La función str_split() ofrece la posibilidad de devolver una matriz aplicando el argumento simplify = TRUE.

Cree un script llamado num_simbolos.R que cuente los símbolos de una frase.

Respuesta
1
2
3
4
frase <- readline(prompt="Indique la frase: ")
split_frase <- gsub(" ", "", frase)
num_simbolos <- nchar(split_frase)
cat("La frase contiene", num_letras, "símbolos.")

La biblioteca stringr posee una gran cantidad de funciones interesantes además de las mencionadas anteriormente. A continuación, se muestran varias de ellas:

stringr Función
str_c() Combina cadenas
str_sub() Extrae partes de cadenas
str_extract() Extrae partes de cadenas
str_to_upper() Cambia cadenas a mayúscula
str_to_lower() Cambia cadenas a minúscula
str_sort() Ordena cadenas por alfabeto
str_detect() Detecta coincidencias
str_count() Indica el número de coincidencias

Ejemplos

1
2
3
4
5
6
7
8
9
cadena_1_2 <- str_c(cadena1, cadena2, sep="; ")
cadena1_sub <- str_sub(cadena1, 1, 6)
cadena1_extr <- str_extract(cadena1, "cadena")
cadena1_extr_all <- str_extract_all(cadena1, "")
cadena_up <- str_to_upper(cadena1_sub)
cadena_low <- str_to_lower(cadena_up)
dna_sort <- str_sort(c("D", "N", "A"))
A_dna_detect <- str_detect(dna_sort, "A")
num_A_dna_detect <- str_count(dna_sort, "A")

Info

La función str_extract_all() permite realizar extracciones distintas y devuelve una lista o, mediante el argumento simplify=TRUE, una matriz.

Cree un script llamado ordenagente.R que devuelva los nombres de un grupo de gente ordenados y en mayúscula.

Respuesta
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
library("stringr")
print("¿Cuántas personas engloba el grupo? ")
n_gente <- scan(n=1)
v_gente1 <- 2:n_gente
v_gente2 <- readline(prompt="Indique un integrante: ")
for (i in v_gente1){
  v_gente2[i] <- readline(prompt="Indique otro integrante: ")
}
sort_up_gente <- str_sort(str_to_upper(v_gente2))
print(sort_up_gente)

Ejercicios complementarios

Cree un script llamado adn_a_arn_codones.R que devuelva el transcrito que se obtendría de una secuencia de ADN determinada y la división en codones.

Respuesta
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
library("stringr")
adn <- readline(prompt="Introduzca la secuencia de ADN: ")
arn <- str_replace_all(adn, c("A"="U", "T"="A", "G"="c", "C"="G"))
arn <- str_to_upper(arn)
cat("ARN:", arn)
codones <- c()
ncodones <- nchar(arn) / 3 + 1
aa <- 1
ab <- 3
for (i in 1:ncodones){
  codones[i] <- str_sub(arn, aa, ab)
  ab <- ab + 3
  aa <- aa + 3
}
cat("Codones:", codones)

Cree un script llamado tabla_nucleotidos.R que devuelva la cantidad de nucleótidos como tabla.

Respuesta
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
library("stringr")
adn <- readline(prompt="Introduzca la secuencia de ADN: ")
cadena <- strsplit(adn,"")
nucleotidos <- sort(unique(cadena))
histo <- matrix(0,1,length(nucleotidos))
for(i in 1:length(nucleotidos)){
  histo[i]<- str_count(adn, nucleotidos[i])
}
colnames(histo) <- nucleotidos
rownames(histo) <- "cantidad"
print(histo)

Ejercicio resumen

El siguiente archivo .Rmd contiene un ejercicio de manipulación de una cadena procedente de un archivo FASTA (FASTA File), de modo que resuma de forma explicativa lo estudiado en este apartado, por lo que requiere la instalación de la biblioteca tidyverse: cadenas_fasta.Rmd. El archivo FASTA es el mismo cuya descarga es utilizada como ejemplo de descarga de ficheros en R en Conceptos básicos, por tanto podría acceder a dicho archivo de ambas formas.

Enlaces de interés