¿Cómo cambiar el nombre de una sola columna en un data.frame?

335

Sé que si tengo un marco de datos con más de 1 columna, puedo usar

colnames(x) <- c("col1","col2")

cambiar el nombre de las columnas. ¿Cómo hago esto si es solo una columna? Es decir, un vector o marco de datos con una sola columna.

Ejemplo:

trSamp <- data.frame(sample(trainer$index, 10000))
head(trSamp )
#   sample.trainer.index..10000.
# 1                      5907862
# 2                      2181266
# 3                      7368504
# 4                      1949790
# 5                      3475174
# 6                      6062879

ncol(trSamp)
# [1] 1
class(trSamp)
# [1] "data.frame"
class(trSamp[1])
# [1] "data.frame"
class(trSamp[,1])
# [1] "numeric"
colnames(trSamp)[2] <- "newname2"
# Error in names(x) <- value : 
#   'names' attribute [2] must be the same length as the vector [1]
Chillido búho
fuente
44
La solución de @ aix funcionará para un marco de datos de 1 columna. Probablemente esté confundido por el drop=TRUEargumento predeterminado de [, que hace que un objeto de "1 columna" se convierta en un vector ... y los vectores no lo tienen colnames. Un ejemplo de lo que intentaste sería muy útil.
Joshua Ulrich
2
funciona si usas "colnames (x) [1] <- 'newname2'"
screechOwl

Respuestas:

345
colnames(trSamp)[2] <- "newname2"

intenta establecer el nombre de la segunda columna. Su objeto solo tiene una columna, por lo que el comando arroja un error. Esto debería ser suficiente:

colnames(trSamp) <- "newname2"
Joshua Ulrich
fuente
1
. @ JoshuaUlrich - Esto no parece funcionar si el nombre de la columna es algo así como "A,B,C,X,Y,Z"donde quiero cambiarle el nombre a Yutilizar testData[379] <- "Y".
Chetan Arvind Patil
576

Esta es una forma generalizada en la que no tiene que recordar la ubicación exacta de la variable:

# df = dataframe
# old.var.name = The name you don't like anymore
# new.var.name = The name you want to get

names(df)[names(df) == 'old.var.name'] <- 'new.var.name'

Este código hace más o menos lo siguiente:

  1. names(df) examina todos los nombres en el df
  2. [names(df) == old.var.name] extrae el nombre de la variable que desea verificar
  3. <- 'new.var.name' asigna el nuevo nombre de variable.
Side_0o_Effect
fuente
55
También soy bastante nuevo con R, ¡me encantó esta solución! De hecho, he verificado lo que hace, y creo que vale la pena especificar que en [names(df) == old.var.name]realidad devuelve un vector con valores verdadero / falso. Por lo tanto, tiene el potencial de cambiar varios nombres de columna si, por ejemplo, se utilizan expresiones regulares.
mikyatope
3
Para resultados de expresiones regulares, use algo como names(df) = sub('pattern', 'replacement', names(df)). De lo contrario, intentaría establecer varias columnas con el mismo nombre.
Todos somos Mónica
40
Sentimientos encontrados ... en un mundo perfecto, donde abundan los lenguajes de programación perfectos, ¿realmente requeriría tantas teclas para cambiar el nombre de una sola columna? Amo a R pero a veces quiero estrangularlo por este tipo de razones.
tumultous_rooster
44
¿Cómo no hay una función de contenedor para esto en la base?
ifly6
1
¡Cómo todos deseamos! No sé sobre ahora, pero en aquel entonces no había ningún contenedor en la base
Side_0o_Effect
85
colnames(df)[colnames(df) == 'oldName'] <- 'newName'
zongshiwujie
fuente
2
Me gusta esta solución, ya que puede hacer referencia al nombre de la columna por nombre, en lugar de requerir saber qué columna de número es. Mejor para características de mayor número.
Cibernético el
1
Tengo una pequeña extensión de la pregunta y esta respuesta. Tengo un marco de datos con una columna que tiene las letras 'snp' . Quiero cambiarle el nombre a 'Marcador' . Pero quiero usar una expresión regular para hacerlo. Aparentemente, el código que tengo es defectuoso: colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] <- "Marker"porque la columna no ha cambiado de nombre. Si hago names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] <- "Marker"que se cambia el nombre. ¿Qué me estoy perdiendo?
Sander W. van der Laan
76

Esta es una vieja pregunta, pero vale la pena señalar que ahora puede usarla setnamesdesde el data.tablepaquete.

library(data.table)

setnames(DF, "oldName", "newName")

# or since the data.frame in question is just one column: 
setnames(DF, "newName")

# And for reference's sake, in general (more than once column)
nms <- c("col1.name", "col2.name", etc...)
setnames(DF, nms)
Ricardo Saporta
fuente
66
o setNamesdesde la base R.
PatrickT
53

Esto también se puede hacer usando el plyrpaquete de Hadley y la renamefunción.

library(plyr) 
df <- data.frame(foo=rnorm(1000)) 
df <- rename(df,c('foo'='samples'))

Puede cambiar el nombre por el nombre (sin conocer la posición) y realizar varios cambios de nombre a la vez. Después de hacer una fusión, por ejemplo, puede terminar con:

  letterid id.x id.y
1       70    2    1
2      116    6    5
3      116    6    4
4      116    6    3
5      766   14    9
6      766   14   13

Que luego puede renombrar en un solo paso usando:

letters <- rename(letters,c("id.x" = "source", "id.y" = "target"))

  letterid source target
1       70      2      1
2      116      6      5
3      116      6      4
4      116      6      3
5      766     14      9
6      766     14     13
alexplanation
fuente
77
renameahora también es una función en el dplyrpaquete.
Sam Firke
36

Creo que la mejor manera de cambiar el nombre de las columnas es usar el paquete dplyr de esta manera:

require(dplyr)
df = rename(df, new_col01 = old_col01, new_col02 = old_col02, ...)

Funciona igual para renombrar una o varias columnas en cualquier conjunto de datos.

Luis Vazquez
fuente
12

Me gusta el siguiente estilo para cambiar el nombre de los nombres de columna del marco de datos uno por uno.

colnames(df)[which(colnames(df) == 'old_colname')] <- 'new_colname'

dónde

which(colnames(df) == 'old_colname')

regresa por el índice de la columna específica.

jshepherd
fuente
1
+1 por darle al usuario la oportunidad de usar el nombre antiguo real :)
1
¿Cuál es aquí la diferencia en comparación con la solución de @zongshiwujie?
buhtz
which()no es necesario.
sindri_baldur
12

Creo que la forma más conveniente de cambiar el nombre de una sola columna es usar dplyr::rename_at:

library(dplyr)
cars %>% rename_at("speed",~"new") %>% head     
cars %>% rename_at(vars(speed),~"new") %>% head
cars %>% rename_at(1,~"new") %>% head

#   new dist
# 1   4    2
# 2   4   10
# 3   7    4
# 4   7   22
# 5   8   16
# 6   9   10
  • funciona bien en tuberías
  • conveniente cuando los nombres se almacenan en variables
  • funciona con un nombre o un índice de columna
  • claro y compacto
Moody_Mudskipper
fuente
6

Puede usar el rename.varsen el gdatapaquete.

library(gdata)
df <- rename.vars(df, from = "oldname", to = "newname")

Esto es particularmente útil cuando tiene que cambiar más de un nombre de variable o si desea agregar o agregar texto a los nombres de las variables, luego puede hacer algo como:

df <- rename.vars(df, from = c("old1", "old2", "old3", 
         to = c("new1", "new2", "new3"))

Para ver un ejemplo de agregar texto a un subconjunto de nombres de variables, consulte: https://stackoverflow.com/a/28870000/180892

Jeromy Anglim
fuente
Esto es lo más fácil, gracias. Tuve problemas con el paquete dplyr.
DannyB
4

Tratar:

colnames(x)[2] <- 'newname2'
NPE
fuente
8
Esto es lo que arrojó el error sobre el que OP preguntó (en su edición). No funcionará, ya que el marco de datos solo tiene una columna.
. @ NPE - Esto no parece funcionar si el nombre de la columna es algo así como "A,B,C,X,Y,Z"donde quiero cambiarle el nombre a Yutilizar testData[379] <- "Y".
Chetan Arvind Patil
4

Es probable que esto ya esté disponible, pero estaba jugando con renombrar campos mientras buscaba una solución y probé esto por capricho. Trabajó para mis propósitos.

Table1$FieldNewName <- Table1$FieldOldName
Table1$FieldOldName <- NULL

Editar comienza aquí ...

Esto también funciona.

df <- rename(df, c("oldColName" = "newColName"))
Scottieie
fuente
Para quien me marcó, eso está bien, pero dado que obviamente soy nuevo en hacer esto, tal vez podría aclarar qué estaba mal con la respuesta.
Scottieie
Su respuesta no tiene nada de malo, además de no ser una línea directa ... eso fue solo un usuario SO hostil que no tuvo el coraje de justificar su berrinche.
count0
Gracias @ count0. En realidad, es significativo tener algunos puntos de maná o lo que sea para comentar una pregunta, algo que aún no he podido hacer. Las preguntas de seguimiento en algunos casos estarían bien cuando aprendo un nuevo conjunto de habilidades. De nuevo. TY.
Scottieie
1
Necesitamos dar a todas las columnas el nombre para usar esto.
Arpit Sisodia
¿De qué paquete renameproviene la función?
Diego
3

Si sabe que su marco de datos tiene solo una columna, puede usar: names(trSamp) <- "newname2"


fuente
3

También puede probar 'upData' del paquete 'Hmisc'.

library(Hmisc)

trSamp = upData(trSamp, rename=c(sample.trainer.index..10000. = 'newname2'))

ansek
fuente
¡Muy agradable! También es posible cambiar el nombre de más columnas a la vez: trSamp = upData (trSamp, rename = c (sample.trainer.index..10000. = 'Newname2, AnotherColumnName =' RenameThisColumn '))
FraNut
0

La pregunta del OP ha sido bien y verdaderamente respondida. Sin embargo, aquí hay un truco que puede ser útil en algunas situaciones: coincidencia parcial del nombre de la columna, independientemente de su posición en un marco de datos:

Coincidencia parcial en el nombre:

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("Reported", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

Otro ejemplo: coincidencia parcial en presencia de "puntuación":

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("[[:punct:]]", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA

Estos fueron ejemplos con los que tuve que lidiar hoy, pensé que valdría la pena compartirlos.

PatrickT
fuente
0

Podemos usar rename_withpara renombrar columnas con una función ( stringrfunciones, por ejemplo).

Considere los siguientes datos df_1:

df_1 <- data.frame(
  x = replicate(n = 3, expr = rnorm(n = 3, mean = 10, sd = 1)), 
  y = sample(x = 1:2, size = 10, replace = TRUE)
)

names(df_1)

#[1] "x.1" "x.2" "x.3" "y" 

Cambie el nombre de todas las variables con dplyr::everything():

library(tidyverse)

df_1 %>% 
  rename_with(.data = ., .cols = everything(.), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "var_4"

Cambiar el nombre de partículas nombre con algunos dplyrverbos ( starts_with, ends_with, contains, matches, ...).

Ejemplo con .( xvariables):

df_1 %>% 
  rename_with(.data = ., .cols = contains('.'), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "y"

Cambiar el nombre de la clase con muchas funciones de prueba de clase, como is.integer, is.numeric, is.factor...

Ejemplo con is.integer( y):

df_1 %>% 
  rename_with(.data = ., .cols = is.integer, 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "x.1"   "x.2"   "x.3"   "var_1"

La advertencia:

Mensajes de advertencia: 1: En stri_replace_first_regex (string, pattern, fix_replacement (reemplazo),: la longitud del objeto más largo no es un múltiplo de la longitud del objeto más corto 2: En los nombres [cols] <- .fn (nombres [cols], ...) : el número de elementos a reemplazar no es un múltiplo de la longitud de reemplazo

No es relevante, ya que es solo una inconsistencia seq_along(.)con la función de reemplazo.

neves
fuente
-1

Simplemente agregaría una nueva columna al marco de datos con el nombre que quiero y obtendría los datos de la columna existente. Me gusta esto:

dataf$value=dataf$Article1Order

¡entonces quito la vieja columna! Me gusta esto:

dataf$Article1Order<-NULL

¡Este código puede parecer tonto! Pero funciona perfectamente ...

Niloufar
fuente
-1

Simplemente cambiaría el nombre de una columna al conjunto de datos con el nuevo nombre que quiero con el siguiente código: nombres (conjunto de datos) [index_value] <- "new_col_name"

Parthiban M
fuente
-3
library(dplyr)
rename(data, de=de.y)
Hola Mundo
fuente
¿Le gustaría agregar un poco de por qué esto ayuda al problema de OP?
Guillaume Racicot