En esta guía se desarrollará como manipular caracteres con los comandos substr() y substring() que nos permitirán extraer subcadena de caracteres, así también como modificarlos y transformarlos. Al final mostramos como ejemplo un caso práctico de la EHANO, en el cual gracias al comando substring() y la variable ubigeo se logra obtener los departamentos.
Cuando tenemos un vector y deseamos saber los elementos del vector usamos el comando length(). Pero si tenemos un vector de caracteres (palabras) y deseamos saber cuántos caracteres tiene (cuántas letras), no se puede saber con este comando. Para responder a esta duda usamos el comando nchar() que nos devolverá el número de caracteres de los elementos del vector.
Lo primero que haremos será definir dos vectores.
x<-"manipulación de caracteres"
y<-c("Arsenal", "Chelsea", "Tottenham",
"Manchester City", "Manchester United", "Liverpool")
El vector x es un vector de un sólo elemento, por otro lado, el vector y es un vector de 6 elementos.
Si usamos el comando nchar() podremos saber cuántos caracteres (letras en este caso) tiene cada elemento.
# Para contar cuantos caracteres
nchar(x) # Arroja cuántos caracteres tiene el vector x.
## [1] 26
nchar(y) # Arroja cuántos caracteres tiene el vector y.
## [1] 7 7 9 15 17 9
En el primer caso, el vector x tiene 26 caracteres, si usted cuenta las letras contará 24 a estas tiene que agregarle los 2 espacios, lo cual da un total de 26 caracteres.
Para el caso del vector y que tiene 6 elementos, el primero de ellos tiene 7 caracteres, el segundo 7 caracteres, el tercero 9, eñ cuarto 15 (14 letras y un espacio), el quinto 17 (16 letras y un espacio) y el último 9.
Si nosostros deseamos extraer una subcadena podremos usar dos comandos: substr() y substring(). El segundo de ellos es más general incluso acepta vectores en sus argumentos. Veremos a detalle su uso.
Primero substr() tiene la siguiente sintaxis:
substr("x", "star=", "stop=")
Donde x es un vector caracter o texto del que se desea extraer una subcadena. star indica el orden inicial, es decir, la posición inicial de la que se empezará a extraer. Por último, stop indica el orden final. El orden inicial y final viene expresado por números (de la clase integer - aunque funciona con numéricos).
Veamos un ejemplo, si deseamos extraer desde el tercer al sexto caracter del vector x. La sintaxis sería la siguiente:
# Recordar que el vector x es:
x
## [1] "manipulación de caracteres"
substr(x, start = 3, stop = 6) # Para extraer la subcadena desde el tercer al sexto caracter.
## [1] "nipu"
En efecto, el tercer caracter del vector x es la letra “n” y el sexto caracter es “u”. Por lo que el resultado es “nipu”.
Para que quede claro un ejemplo más:
Ahora deseo extraer desde el cuarto caracter hasta el noveno caracter.
substr(x, 4, 9) # Para extraer la subcadena desde el cuarto al noveno caracter.
## [1] "ipulac"
EL cuarto caracter es “i” y el noveno es la “c”, por lo que el resultado es “ipulac”.
Pero ¿qué sucede si deseo aplicar a un vector caracter de varios elementos (como el vector y)? Lo que hará R será realizar la instrucción a cada elemento. Veamos un ejemplo para comprenderlo.
Si deseo que me extraiga desde el primer al tercer caracter del vector y. La sintaxis sería la siguiente:
substr(y, 1, 3) # Para extraer la subcadena desde el primer al tercer elemento.
## [1] "Ars" "Che" "Tot" "Man" "Man" "Liv"
En efecto, nos ha salido las tres primeras letras de cada elemento. Lo curioso de esto es que, en nuestros resultados podemos ver que la palabra “Man” se repite dos veces, la primera es del “Manchester City” y la segunda del “Manchester United”. Más adelante se verá como diferenciar este pequeño detalle. Por el momento sabemos extraer subcadenas, ya es un gran paso. A continuación veamos como funciona el comando substring().
Como se mencionó al inicio, este comando es más general que substr(), por tanto, será de mayor uso.
La sintaxis es la siguiente:
substring("x", "first=", "last=10^6")
Donde x sigue siendo un vector caracter o texto. first indica la posición inicial y last la posición final, el detalle con el argumento last es que no es necesario colocar un final si se desea extraer desde un punto inicial hasta el final. Es así que soportará hasta un millón de caracteres. Otro detalle importante de este comando es que permite en sus argumentos vectores, si en substr() sólo se podía colocar números en los argumentos star y stop en substring() se puede colocar vectores en first y last. Veamos varios ejemplos para comprender a detalle lo comentado.
Primero, si deseo extraer del vector x desde el décimo caracter hasta el último, la sintaxis sería la siguiente:
substring(x, first = 10) # Para extraer la subcadena desde el caracter 10 hasta el último.
## [1] "ión de caracteres"
En efecto, el caracter de posición 10 es la letra “i”, así que desde ahí empezará a extraer hasta el último caracter.
Es seguro que usted está pensando que se podría hacer lo mismo con el comando substr(). La sintaxis sería substr(x, 10, 26). Pero el detalle es que se tendría que conocer el número total de caracteres, lo cual lo hace más tedioso. Imagine si el vector tiene varios elementos como el vector y, sus elementos tienen distinto tamaño y si desea extraer desde un determinado caracter hasta el final tendrá que colocar un número lo suficientemente grande para que represente el final (en el siguiente ejemplo, veamos a detalle esto).
Si deseamos extraer del vector y desde el cuarto caracter hasta el último. la sintaxis sería la siguiente:
substring(y, 4) # Para extraer desde el cuarto caracter.
## [1] "enal" "lsea" "tenham" "chester City"
## [5] "chester United" "erpool"
¿Se podría hacer lo mismo con el comando substr()? Sí, pero en el argumento stop tendríamos que considerar un número lo suficientemente grande para que represente el final de todos los elementos del vector. De esta manera:
substr(y, 4, 100)
## [1] "enal" "lsea" "tenham" "chester City"
## [5] "chester United" "erpool"
Donde el número 100 es lo bastante grande como para indicarle a R que es hasta el final.
Veamos otro ejemplo, en el donde consideramos a los argumentos first y last como vectores.
Si deseo extraer del vector x la primera letra luego la segunda letra y por último la tercera letra. la sintaxis sería la siguiente:
substring(x, 1:3, 1:3) # Para extraer primero desde el primer al primer caracter, luego extraer desde el segundo al segundo caracter y del tercer al tercer caracter.
## [1] "m" "a" "n"
Esto no lo podrá conseguir con el comando substr().
En substring() también puedes considerar un inicio y un final. Vamos hacer el mismo ejemplo en donde se extraía las iniciales de los equipos ingleses del big six (vector y).
z<-substring(y, 1, 3) # Para extraer desde el primero al tercer caracter.
Lo guardamos como un vector z ya que nos interesa diferenciar a los dos Manchester, esto se verá en la siguiente sección.
Veamos otro ejemplo, ahora deseo extraer del vector y los dos primeros caracteres del primer y tercer elemento, luego el segundo y tercer caracter del segundo y cuarto elemento, por último, el tercer y cuarto caracter del tercer y sexto elemento.
substring(y, 1:3, 2:4)
## [1] "Ar" "he" "tt" "Ma" "an" "ve"
Cuando especificamos 1:3 le damos un vector de 3 elementos 1,2,3, así mismo con 2:4 le decimos 2,3,4. Si emparejas los primeros elementos sería 1, 2 lo que indica first=1 y last=2. La siguiente combinación es 2, 3 lo que indica first=2 y last=3. Y por último, 3, 4 indica first=3 y last=4. Esto es lo que hizo. Luego al no haber más combinaciones regresó a realizar los emparejamientos desde el tercer elemento.
Si no comprendió a un 100% le recomendamos ver la documentación del comando substring() digitando en la consola ?substring.
En guías anteriores se desarrolló ejemplos en los que se podía cambiar los elementos de vectores, en esta sección haremos lo mismo pero ahora para caracteres. Desde cambiar un sólo caracter hasta cambiar palabras enteras.
continuaremos usando los comandos substr() y substring() en función de las necesidades de los problemas que desearíamos resolve.
Empecemos con lo básico. Recordemos al vector x.
x
## [1] "manipulación de caracteres"
Nos podemos dar cuenta que el vector x es “manipulación de caracteres”, si nosotros desearíamos cambiar la “m” inicial por una “M” mayúscula para que quede bien escrito, tendríamos que usar la siguiente sintaxis.
substr(x, 1, 1)<-"M" # Para colocar la mayúscula.
x
## [1] "Manipulación de caracteres"
En efecto hemos cambiado la “m”por la “M”. ¿Qué es lo que se hizo?
Con substr(x, 1, 1) extraímos el primer caracter del vector x luego usamos el comando <- que usted sabe que sirve para definir y por último usamos "M" que en conjunto indica, define como “M” al primer caracter del vector x.
Ahora diferenciemos a los dos Manchester del vector z. Primero, recordemos al vector.
z
## [1] "Ars" "Che" "Tot" "Man" "Man" "Liv"
El primer “Man” sabemos que es del Manchester City y el segundo “Man” es del Manchester United. Entonces si queremos que en el primero aparezca “M.C” y en el segundo “M.U”. Haríamos la siguiengte sintaxis.
substring(z[c(4,5)], 2, 3)<-c(".C", ".U") # Para distinguir a los dos manchester.
z
## [1] "Ars" "Che" "Tot" "M.C" "M.U" "Liv"
En efecto, se ha modificado a los dos Manchester. Estoy seguro que ha estas alturas usted puede comprender la sintaxis. Pero de todas formas paso a explicar. Primero, con z[c(4,5)] le indico a R que seleccione los elementos 4 y 5 del vector z (si no comprende revise la guía de “Selección de Elementos y Operadores lógicos”). luego 2 es el valor que toma first, 3 es el valor que toma last que en conjunto indica extraer los caracteres desde el segundo al tercero. Por último, como tengo que cambiar en dos elementos uso c(".C", ".U") que son los valores a cambiar en cada elemento.
Como último ejemplo, veremos un caso con base de datos real. En la encuesta de la ENAHO hay una variable la cual se llama ubigeo el cual consta de 6 números: los dos primeros indican el departamento, los dos siguientes la provincia y los dos finales el distrito.
Entonces, si deseamos saber los departamentos tendremos que extraer los dos primeros números.
Lo primero que tendremos que hacer es cargar el paquete haven porque el archivo tiene extesión .dta.
library(haven)
Luego cargamos la base de datos1.
based<-read_dta("F:/enaho01-2017-100.dta")
Luego observamos como se nos ha cargado:
View(based)
Base de datos de la ENAHO
Podemos observar a la variable ubigeo y como se mencionó tiene 6 números.
Lo primero que haremos es crear la variable departamento en la misma base de datos, extrayendo los 2 primeros números de la variable ubigeo.
based$departamento<-substring(based$ubigeo, 1, 2)
Para ver como quedó nuestra variable departamento escribismos:
View(based$departamento)
Variable Departamento
En efecto, sólo nos ha quedado los dos primeros números.
Pero aún no podemos ver a que departamento corresponde cada uno. Así que tendremos que codificar cada número con su respectivo departamento. Una forma de hacer sería si lo convertimos en factor. Pero esto sólo lo hace si la variable es numérica. Y como se dice, “al ojo” la variable departamento no es numérica. ¿Qué clase de vector es?
str(based$departamento)
## chr [1:43545] "01" "01" "01" "01" "01" "01" "01" "01" "01" "01" "01" ...
## - attr(*, "label")= chr "ubicación geográfica"
## - attr(*, "format.stata")= chr "%6s"
Podemos ver que es de la clase character. Por lo que tendríamos que cambiar la clase de este vector a numeric. Lo anterior se consigue de esta manera.
mode(based$departamento)<-"numeric"
No lo hemos visto anteriormente, pero ahora mostramos como modificar la clase de un vector. Para tal fin se usó el comando mode().
Ahora sí, una vez que ya lo convertimos a numérico lo podemos convertir a factor. Para lo cual realizamos la siguiente sintaxis.
based$departamento<-factor(based$departamento,
levels = c(1:25),
labels = c("Amazonas", "Ancash", "Apurimac",
"Arequipa", "Ayacucho", "Cajamarca",
"Callao", "Cusco", "Huancavelica",
"Huanuco", "Ica", "Junin","La Libertad",
"Lambayeque", "Lima", "Loreto",
"Madre de Dios", "Moquegua", "Pasco",
"Piura", "Puno", "San Martin", "Tacna",
"Tumbes", "Ucayali"))
Ahora si deseamos ver en una tabla el departamento y su respectiva frecuencia absoluta, usaremos el comando table().
departamento<-table(based$departamento)
departamento
##
## Amazonas Ancash Apurimac Arequipa Ayacucho
## 1547 1740 1092 2042 1547
## Cajamarca Callao Cusco Huancavelica Huanuco
## 1749 1302 1635 1300 1611
## Ica Junin La Libertad Lambayeque Lima
## 1801 1948 1904 1622 5969
## Loreto Madre de Dios Moquegua Pasco Piura
## 1835 944 1322 1095 1889
## Puno San Martin Tacna Tumbes Ucayali
## 1744 1690 1789 1006 1422
Los resultados no son nada presentables así que deberíamos de convertirlo a latex. Si deseamos exportar la tabla a formato html, tex, csv, entre otros usaremos el paquete xtable
Entonces, instalamos y cargamos xtable:
install.packages("xtable")
library(xtable)
Ahora definimos a la tabla con el comando xtable().
tablas<-xtable(departamento)
Si lo deseamos tener los códigos en formato .tex (latex), la sintaxis sería la siguiente:
print(tablas, type = "latex")
## % latex table generated in R 3.5.1 by xtable 1.8-4 package
## % Tue Sep 17 17:57:40 2019
## \begin{table}[ht]
## \centering
## \begin{tabular}{rr}
## \hline
## & V1 \\
## \hline
## Amazonas & 1547 \\
## Ancash & 1740 \\
## Apurimac & 1092 \\
## Arequipa & 2042 \\
## Ayacucho & 1547 \\
## Cajamarca & 1749 \\
## Callao & 1302 \\
## Cusco & 1635 \\
## Huancavelica & 1300 \\
## Huanuco & 1611 \\
## Ica & 1801 \\
## Junin & 1948 \\
## La Libertad & 1904 \\
## Lambayeque & 1622 \\
## Lima & 5969 \\
## Loreto & 1835 \\
## Madre de Dios & 944 \\
## Moquegua & 1322 \\
## Pasco & 1095 \\
## Piura & 1889 \\
## Puno & 1744 \\
## San Martin & 1690 \\
## Tacna & 1789 \\
## Tumbes & 1006 \\
## Ucayali & 1422 \\
## \hline
## \end{tabular}
## \end{table}
Que te quedará algo así:
Si no sabes usar latex, no hay problema lo podemos exportar en formato .csv y así lo trabajaría en excel (también se puede a word). La sintaxis es la siguiente:
write.csv(departamento, file = "tabla_departamento.csv")
Si busca en su directorio encontrará un archivo llamado “tabla_departamento” similar a este:
Tabla de Departamento en formato .csv
Y de ahí ya es fácil editar y seguro saldrá una gran presentación.
En guías posteriores se verá a profundidad el tema de realizar tablas, por ahora se desarrolló como un pequeño aperitivo y así ver lo genial que es R.
En la siguiente guía se desarrollará el tema de manipulación de caracteres en R, la segunda parte.