12  NOMBRES

A continuación se enumeran los aspectos que es necesario tener en cuenta al nombrar los objetos, así como sus elementos constitutivos.

  1. Todos los nombres deben comenzar con una letra.

  2. Es posible incluir caracteres numéricos como parte de los nombres, pero no en la primera posición.

  3. No se admiten caracteres especiales, es decir, símbolos que tengan un uso específico dentro del lenguaje R, tales como +, -, *, /, ^, \, |, (, ), [, ], {, }, “, ’, `, #, $, %, &, @, =, ?, !, etc.

  4. No se admiten espacios.

  5. Cuando el nombre que se pretende usar está conformado por varias palabras, suelen usarse el punto (.) y el guion bajo (_) como símbolos de enlace.

    Son comunes y válidos nombre como:

    • variable.escalada
    • variable_escalada
  6. Aunque podría usarse punto (.) en la primera posición del nombre de un objeto, el objeto sería invisible1.

  7. Son admisibles los caracteres propios del alfabeto latino, tales como la ñ y las vocales con tilde.

  8. También son admisibles los caracteres correspondientes a los idiomas modernos de Europa Oriental y Asia.

    En tal sentido, cualquiera de las siguientes cadenas de caracteres es un nombre válido en R:

    • 汉字
    • русский
    • 日本語
    • العربية
    • 한국어
  9. R es case-sensitive. Esto quiere decir que se distingue entre mayúsculas y minúsculas.

¡Nombre sintácticamente válido!

Un nombre sintácticamente válido en R es el que se ciñe a las restricciones enumeradas anteriormente.

Las anteriores consideraciones son aplicables a los nombres de los objetos, así como a los nombres de sus diferentes componentes.

12.1 Elementos nombrables

En adición a los nombres de los objetos, en R es posible —y en ocasiones hasta obligatorio— nombrar los elementos constitutivos de los vectores, matrices, arreglos, data frames o listas, así:

  • Nombre del objeto. Es obligatorio, siempre que se pretenda invocarlo posteriormente2.
  • Nombre de filas. Aplica a objetos de dos o más dimensiones. Es optativo.
  • Nombre de columnas. Aplica a objetos de dos o más dimensiones. Es obligatorio en data frames, y optativo en los demás casos.
  • Nombre de elementos de la tercera dimensión y posteriores. Aplica a arreglos de tres o más dimensiones. Es optativo en todos los casos.
  • Nombre de elementos individuales. Es optativo en todos los casos. Son poco comunes, excepto en listas.

La figura 12.1 se basa en la representación del arreglo letras (cf. sección 8.3) para ilustrar algunos de estos conceptos.

Figura 12.1: Nombres de los diferentes elementos del arreglo letras

La figura 12.1 permite comprender por qué son tan poco comunes los nombres de los elementos individuales o celdas. Considérese, por ejemplo, el elemento ubicado en la celda superior izquierda posterior. Si, en adición al nombre del objeto contenedor (letras), se indica que ese elemento corresponde a unidad1, v1, tiempo2, y además se tiene su valor ("b"), el elemento queda completamente especificado, siendo innecesario, redundante y hasta posiblemente conflictivo asignarle algún nombre adicional.

12.1.1 Elementos nombrables en data frames

El data frame es una estructura rectangular, con observaciones en filas y variables en columnas.

En los data frames, cada columna (variable) tiene obligatoriamente un nombre. Dos columnas no pueden tener el mismo nombre. Cuando se genera un data frame por importación, el nombre de la columna puede leerse de la información contenida en la primera fila o puede definirse automáticamente como V1, V2, …, VK, siendo K el número de columnas. Este comportamiento queda definido por la función usada para la importación y sus argumentos (cf. capítulo 6).

Las filas (observaciones) también tienen nombres; por defecto, son los enteros desde 1 hasta n, siendo n el número de observaciones. Dos filas no pueden tener el mismo nombre. Los nombres de las filas se asignan automáticamente al momento de la importación o creación del data frame.

Los data frames no admiten nombres para los elementos individuales o celdas.

12.1.2 Elementos nombrables en arreglos

Las matrices (que también son arreglos) admiten nombres para las filas y para las columnas, así como para cada uno de los elementos individuales o celdas.

Asimismo, los arreglos de dos o más dimensiones admiten nombres tanto para los componentes de sus diferentes dimensiones, como para cada uno de sus elementos individuales o celdas.

12.1.3 Elementos nombrables en vectores

Los vectores, al ser estructuras unidimensionales, únicamente admiten nombres para sus diferentes elementos.

12.1.4 Elementos nombrables en listas

Las listas —que son objetos unidimensionales o vectores genéricos— únicamente admiten nombres para sus elementos o componentes. Estos elementos son equivalentes a los elementos individuales de los vectores atómicos.

No obstante, los subelementos que formen parte los elementos de las listas también podrían admitir nombres, acorde con su naturaleza. Así, por ejemplo, si uno de los elementos de una lista fuera una matriz, las filas, las columnas y las celdas de dicha matriz podrían tener nombres.

Nombres obligatorios

Los únicos nombres obligatorios son los de los objetos3 y los de las columnas y las filas de los data frames; todos los demás nombres son optativos.

12.2 Recuperación de nombres

Las funciones names, rownames, colnames y dimnames permiten recuperar los nombres de los elementos constitutivos de los objetos que se usan como contenedores de datos.

12.2.1 Recuperación de nombres en data frames

Cuando el argumento de la función names es un data frame, el resultado es el nombre de las columnas.

Este resultado tiene sentido, si se considera que esto es lo que el usuario normalmente quiere saber cuando consulta los nombres en un data frame. El nombre de las filas es secundario. Aunque las filas de los data frames tienen nombres, el usuario no suele estar interesado en su manipulación. Por otra parte, los data frames no admiten nombres para las celdas.

id <- c("a23", "f31", "j33", "m54")
v1 <- c(2.4, 7.9, 1.1, 8.5)
v2 <- c(4+3i, 2-0.8i, 1+1.1i, 3-5i)
df <- data.frame(id, v1, v2)
names(df)
[1] "id" "v1" "v2"

Cuando se genera un data frame a partir de la concatenación de vectores, el data frame hereda los nombres de los vectores, tal y como se ejemplifica para el data frame df. En los data frames que se surgen de la importación de datos, los nombres suelen leerse de la primera fila del archivo externo o generarse por defecto (cf. capítulo 6).

Puesto que los data frames son objetos bidimensionales, conformados por filas y columnas, también pueden usarse las funciones rownames (alias de row.names) y colnames, para recuperar los nombres de las filas y las columnas respectivamente.

Los nombres por defecto de las filas de los data frames son los enteros consecutivos entre 1 y el número de observaciones.

rownames(df)
[1] "1" "2" "3" "4"

En los data frames la función colnames genera el mismo resultado que names: recupera los nombres de las columnas o variables.

colnames(df)
[1] "id" "v1" "v2"

En los data frames también puede usarse la función dimnames para obtener de manera simultánea los nombres de los elementos constitutivos de sus dos dimensiones:

dimnames(df)
[[1]]
[1] "1" "2" "3" "4"

[[2]]
[1] "id" "v1" "v2"

12.2.2 Recuperación de nombres en listas

Cuando el argumento de names es una lista, el resultado es el nombre de sus elementos o componentes, en caso de que a estos se les hubiera asignado un nombre (que no es obligatorio). En caso contrario, el resultado sería NULL.

lista2 <- list(c(4.1, -2.7, 7.3), matrix(c("a", "b", "c", "d"), nrow = 2))
names(lista2)
NULL

Este resultado también tiene sentido, si se tiene en cuenta que las listas son objetos unidimensionales, por lo que no aplicaría ninguna consulta relacionada con nombres de elementos dimensionales. La única pregunta, en términos de nombres, que tiene sentido cuando se hace referencia a una lista, tiene que ver con los nombres de sus elementos.

12.2.3 Recuperación de nombres en objetos atómicos

Al evaluar la función names con objetos atómicos (vectores, matrices o un arreglos) como argumento, se obtendría por resultado el nombre de las celdas o elementos individuales, en caso de que se les hubiera asignado un nombre. Esta situación, además de no ser obligatoria, es poco usual. Si los elementos no tuvieran nombres, el resultado sería NULL.

vocales <- c("a", "e", "i", "o", "u")
names(vocales)
NULL

En caso de que los diferentes elementos dimensionales de las matrices o arreglos tuvieran nombres (no son obligatorios), estos podrían recuperarse con las funciones rownames, colnames y dimnames.

Para el caso de matrices es posible recuperar los nombres de las filas usando rownames, y los nombres de las columnas usando colnames. Estas mismas funciones aplican para las dos primera dimensiones de arreglos con mayor dimensionalidad.

Para cualquier objeto atómico de dimensión 2 o mayor, es posible recuperar simultáneamente los nombres de los diferentes elementos dimensionales mediante la función dimnames.

12.3 Asignación de nombres

En ocasiones, los nombres de los componentes se generan automáticamente durante la creación de los objetos. En otros casos, es posible indicarlos de manera explícita mediante la introducción de argumentos en las funciones usadas para su creación.

En todos los casos es posible asignar o modificar los nombres de los componentes en objetos ya creados, mediante las funciones names, rownames, colnames y dimnames y el operador de asignación <-. Estas funciones cumplen los mismos roles que se indicaron en la sección 12.2 para recuperación de nombres. Consecuentemente, el uso de las funciones rownames, colnames y dimnames solo aplica para los nombres de los componentes de objetos multidimensionales.

12.3.1 Asignación de nombres en data frames

En consonancia con lo indicado en la sección 12.2.1, en cuanto a que la función names en los data frames se refiere a los nombres de las variables, es posible usar esta misma función para modificar los nombres de las variables en un data frame existente.

Consideremos nuevamente el data frame df construido anteriormente, con los nombres heredados al momento de su creación (los nombres de los vectores constitutivos):

id <- c("a23", "f31", "j33", "m54")
v1 <- c(2.4, 7.9, 1.1, 8.5)
v2 <- c(4+3i, 2-0.8i, 1+1.1i, 3-5i)
df <- data.frame(id, v1, v2)
names(df)
[1] "id" "v1" "v2"

Es posible modificar estos nombres y usar en su lugar algunos nombres personalizados.

names(df) <- c("identificador", "lectura1", "lectura2")
names(df)
[1] "identificador" "lectura1"      "lectura2"     

La línea 1 asigna los nuevos nombres a las variables del data frame df. La línea 2 recupera los nombres actualizados.

Equivalentemente, podría usarse la función colnames en la línea 1, lo cual generaría los mismos cambios. Esto es debido a que la función names aplicada sobre un data frame se refiere los nombres de sus columnas.

Para modificar los nombres de las filas se usa la función rownames

Observemos inicialmente los nombres por defecto de las filas del dataframe df:

rownames(df)
[1] "1" "2" "3" "4"

Tal y como se indicó en la sección 12.1.1, las filas vienen nombradas por defecto con los números enteros desde 1 hasta el número de observaciones.

Es posible asignar nombres personalizados a las filas:

rownames(df) <- c("primero", "segundo", "tercero", "cuarto")
rownames(df)
[1] "primero" "segundo" "tercero" "cuarto" 

La línea 1 asigna los nuevos nombres a las filas del data frame df. La línea 2 recupera los nombres actualizados.

12.3.2 Asignación de nombres en listas

Aunque no es obligatorio asignar nombres a los elementos de las listas, sí puede ser muy conveniente, dada la complejidad de estos contenedores. Asignarles nombres a los componentes de las listas facilita la visualización de sus contenidos.

Considérese la lista planilla conformada a partir de la agregación de tres vectores:

nombre <- c("Pablo", "Víctor", "Sandra")
rh <- c("O-", "AB+", "O-")
edad <- c(28, 53, 49)
planilla <- list(nombre, rh, edad)
names(planilla)
NULL

Nótese que —a diferencia de lo que sucede con los data frames— las listas no heredan los nombres a partir de los elementos que se usen para su conformación (los nombres de los vectores en esta caso).

No obstante, es posible definir los nombres de los elementos durante la creación, definiendo los elementos de la lista mediante pares nombre = contenido, así:

nombre <- c("Pablo", "Víctor", "Sandra")
rh <- c("O-", "AB+", "O-")
edad <- c(28, 53, 49)
planilla <- list(id = nombre, rh = rh, edad)
names(planilla)
[1] "id" "rh" ""  

En este ejemplo se ilustran diferentes posibilidades:

  • Puede asignársele al elemento de la lista un nombre diferente al del elemento usado para su constitución. Así, el argumento id = nombre indica que el primer elemento de la lista tendrá el nombre id y que su contenido será el del objeto nombre.

  • Puede nombrarse el elemento de la lista de la misma forma que el elemento que lo conforma. Así, el argumento rh = rh indica que el segundo elemento de la lista tendrá el nombre rh y que su contenido será el del objeto rh.

  • Podría dejarse algún elemento sin nombre. Aunque esto no tendría mucho sentido en un contexto en el que los demás elementos hubieran sido nombrados, sería posible. Así, el argumento edad indica que el contenido del tercer elemento de la lista es el del objeto edad. A dicho elemento no se le asigna ningún nombre.

También es posible asignar o modificar los nombres de los elementos de una lista, mediante la función names.

names(planilla) <- c("nombre", "Rh", "edad")
names(planilla)
[1] "nombre" "Rh"     "edad"  

La línea 1 asigna nombres a los elementos de la lista planilla. La línea 2 recupera los nombres de los elementos de la lista.

12.3.3 Asignación de nombres en vectores

Puesto que los vectores son objetos unidimensionales, solo es posible asignarles nombres a sus elementos. Los elementos de los vectores no traen nombres por defecto.

Considérese el siguiente vector:

a <- c(1, 2, 3)
names(a)
NULL

Durante la creación del vector, es posible asignarles nombres a los diferentes elementos así:

a <- c(uno = 1, dos = 2, tres = 3)
names(a)
[1] "uno"  "dos"  "tres"

También podrían asignarse o modificarse los nombres de los elementos de un vector ya creado, mediante la función names, así:

names(a) <- c("one", "two", "three")
names(a)
[1] "one"   "two"   "three"

La línea 1 les asigna nombres a los elementos del vector a. La línea 2 recupera los nombres.

12.3.4 Asignación de nombres en matrices y arreglos

Mediante la función names es posible —aunque muy poco común— asignar nombres a los elementos de cada una de las celdas de una matriz o arreglo (cf. sección 12.1).

Los nombres que más a menudo suelen manipularse en objetos atómicos multidimensionales (matrices y arreglos) son los de sus componentes dimensionales, es decir, los de las filas, columnas y demás dimensiones, si hubiera lugar a ello.

Cuando las matrices se generan por concatenación de vectores por columnas, mediante la función cbind, las columnas heredan los nombres de los vectores usados para la conformación. Si se genera por concatenación de vectores por filas, mediante la función rbind, las filas heredan los nombres de los vectores usados para la conformación (cf. sección 8.2).

  • Para definir o modificar los nombres de las filas de matrices o arreglos ya creados, se usa la función rownames.

  • Para definir o modificar los nombres de las columnas de matrices o arreglos ya creados, se usa la función colnames.

  • Para definir de manera simultánea los nombres de los diferentes elementos dimensionales de matrices o arreglos, se usa dimnames, sea como argumento, durante la creación del objeto, o como función cuando el objeto ya existe.

A continuación se ilustra el uso de las funciones rownames y colnames para definir los nombres de las filas y las columnas de una matriz.

m <- matrix(c(2, 0, 5, -1, 9, 1), nrow = 2, ncol = 3, byrow = TRUE)
rownames(m) <- c("fila1", "fila2")
colnames(m) <- c("col1", "col2", "col3")
dimnames(m)
[[1]]
[1] "fila1" "fila2"

[[2]]
[1] "col1" "col2" "col3"

La línea 1 crea la matriz. Puesto que no se crea por concatenación de vectores, ninguna de sus elementos tiene nombre. La línea 2 les asigna nombres a las filas. La línea 3 les asigna nombres a las columnas. La línea 4 recupera los nombres de todas las dimensiones de m.

A continuación se ilustra el uso de dimnames como argumento para la definición de los nombres de los diferentes elementos dimensionales de una matriz o un arreglo. El valor de dimnames debe ser una lista, en la que cada uno sus elementos corresponde a una dimensión. Los nombres de los encabezados en cada dimensión se organizan en un vector.

Considérese el arreglo tridimensional letras esquematizado en la figura 12.1. A continuación se ilustra el uso de dimnames como argumento de la función array.

letras <- array(c('a', 'c', 'f', 'd',
                  'x', 'm', 'j', 'l',
                  'd', 'b', 'u', 'y', 
                  'b', 'j', 'h', 'i',
                  'h', 'o', 'w', 'p',
                  'r', 's', 'n', 'q'), dim = c(4, 3, 2),
                dimnames = list(
1                                c("unidad1", "unidad2", "unidad3", "unidad4"),
2                                c("v1", "v2", "v3"),
3                                c("tiempo1", "tiempo2")))
dimnames(letras)
1
Vector con los nombres de la primera dimensión
2
Vector con los nombres de la segunda dimensión
3
Vector con los nombres de la tercera dimensión
[[1]]
[1] "unidad1" "unidad2" "unidad3" "unidad4"

[[2]]
[1] "v1" "v2" "v3"

[[3]]
[1] "tiempo1" "tiempo2"

Igualmente podría usarse dimnames como función para asignar o modificar los nombres de un objeto ya creado, así:

dimnames(letras) <- list(c("unidad1", "unidad2", "unidad3", "unidad4"), 
                         c("v1", "v2", "v3"),    
                         c("tiempo1", "tiempo2"))
En resumen…


Las funciones names, colnames, rownames y dimnames permiten gestionar los nombres de los componentes de los objetos que se usan como contenedores de datos, tal y como se resumen en la tabla 12.1.

Tabla 12.1: Funciones para manejar los nombres de los componentes de los objetos usados como contenedores de datos
data frames listas vectores matrices arreglos
names variables elementos elementos celdas celdas
colnames variables no aplica no aplica columnas columnas
rownames observaciones no aplica no aplica filas filas
dimnames observaciones y variables no aplica no aplica filas y columnas todas las dimensiones
Nombres no estándar

Cuando se importan datos desde fuente externas, estas pueden contener variables cuyos nombres no sean sintácticamente válidos para R4. Lo que sucede con tales nombres durante la importación depende de la función que se use.

Cuando se usa alguna de las funciones read.table, read.delim, read.delim2, read.csv o read.csv2 (cf. sección 6.1), los caracteres no estándar (espacios o símbolos especiales) se remplazan por puntos, con lo cual, todos los nombres del data frame resultante son sintácticamente válidos.

En contraste, cuando se usa la función read_excel{readxl} para importar datos desde archivos Excel, los nombres no se modifican, sin importar si se trata de nombres sintácticamente válidos o no. Esto puede dar lugar a nombres no estándar para algunas de las variables del data frame resultante.

Es posible, sin embargo, forzar el reconocimiento de nombres no estándar, encerrándolos entre comillas invertidas (` `).

Así, por ejemplo, nombres como `log (UFC)` o `3a lectura %` son reconocidos por la mayoría de funciones en R.

Se desaconseja el uso de nombres no estándar por las siguientes razones:

  1. Hace más tediosa la escritura del código.
  2. Disminuyen la legibilidad del código.
  3. Generarían errores si se omitieran las comillas invertidas.
  4. No son compatibles con todas las funciones.

Se recomienda evitar los nombres no estándar, a fin de mantener el código limpio y portable.

Lo más directo para evitar la aparición de nombres no estándar en los data frames que se importen mediante la función read_excel{readxl} consiste en usar nombres sintácticamente válidos en el archivo fuente de Excel.

Si esto resultara muy dispendioso, poco práctico o irrealizable, podría realizarse una adaptación de los nombres resultantes, mediante la función make.names{stats}

names(df) <- make.names(names(df)) 

  1. Esto aplica únicamente a los objetos; no, a sus elementos constitutivos.↩︎

  2. No obstante, podrían manejarse objetos efímeros, a los que no se les asigna ningún nombre, pero que tampoco podrían invocarse posteriormente.↩︎

  3. Si se pretende invocarlos posterirmente.↩︎

  4. Aunque sí podrían serlo en el archivo fuente original.↩︎