Cambiar los nombres de columna de un marco de datos


399

Tengo un marco de datos llamado "newprice" (ver más abajo) y quiero cambiar los nombres de columna en mi programa en R.

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164

De hecho, esto es lo que estoy haciendo:

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice") 

No he puesto esto en un bucle porque quiero que cada nombre de columna sea diferente como ves.

Cuando pego mi programa en la consola R, este es el resultado que me da:

> names(newprice)[1]<-paste(“premium”)
Error: unexpected input in "names(newprice)[1]<-paste(“"
> names(newprice)[2]<-paste(“change”)
Error: unexpected input in "names(newprice)[2]<-paste(“"
> names(newprice)[3]<-paste(“newpremium”)
Error: unexpected input in "names(newprice)[3]<-paste(“"

También intenté usar la c()función, por ejemplo c("premium"), en lugar depaste() función, pero fue en vano.

¿Alguien podría ayudarme a resolver esto?


Si la respuesta de Dirk funciona, entonces el problema era que estaba trabajando con una matriz en lugar de con un marco de datos. Puede verificar esto con is.matrixo str.
IRTFM

3
Vea esta respuesta en dplyr :: rename stackoverflow.com/a/26146202/1831980
Rasmus Larsen

8
colnames(newprice)<- c("premium","change","newprice")
Tung Nguyen

Su error no tiene nada que ver con la calidad de su código. Simplemente estás usando el símbolo incorrecto. Este "no es reconocido por R, usa" en su lugar. Sé que pueden verse igual. Mira de cerca: "". Eso es.
Edo

Respuestas:


595

Usa la colnames()función:

R> X <- data.frame(bad=1:3, worse=rnorm(3))
R> X
  bad     worse
1   1 -2.440467
2   2  1.320113
3   3 -0.306639
R> colnames(X) <- c("good", "better")
R> X
  good    better
1    1 -2.440467
2    2  1.320113
3    3 -0.306639

También puedes subconjuntar:

R> colnames(X)[2] <- "superduper"

12
@Dirk ¿Por qué no usar nombres () en lugar de colnames ()?
Antoine Lizée

44
¡Excelente! También puede subconjuntar varias columnas a la vez (útil en grandes marcos de datos). colnames(X)[c(1,2)] <- c("good", "better")
metakermit

77
Prueba setnames()en el data.tablepaquete. Use algo como setnames(DT,"b","B")osetnames(DT,c("a","E"),c("A","F"))
dwstu

Extrañamente, después de configurar los nombres de columna del marco de datos q1, tratando de mutar el marco de datos usando dplyrcomo en los q1 <- q1 %>% mutate(rel_count = count / 482462)resultados del error Error in mutate_impl(.data, dots) : unknown column 'days'(donde daysse le da un nuevo nombre a la columna). Esto es realmente frustrante.
David Tonhofer

176

Yo uso esto:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"

77
Gracias. Creo que esto es de alguna manera molesto con R: ¿Por qué es tan difícil cambiar el nombre de la columna si no desea usar el número de índice sino el nombre anterior :(
Arne

10
Este método tiene la ventaja de que no tiene que preocuparse por la posición de la columna, siempre que conozca su nombre original. Creo que este es el método preferido, ya que más tarde puede hacer cambios en el código que cambian la posición de la columna a la que desea cambiar el nombre.
Paulo S. Abreu

78

El error es causado por las "comillas inteligentes" (o como se llamen). La lección aquí es, "no escriba su código en un 'editor' que convierta comillas en comillas inteligentes".

names(newprice)[1]<-paste(“premium”)  # error
names(newprice)[1]<-paste("premium")  # works

Además, no necesita paste("premium")(la llamada a pastees redundante) y es una buena idea colocar espacios <-para evitar confusiones (por ejemplo x <- -10; if(x<-3) "hi" else "bye"; x).


51

¿Intentaste solo:

names(newprice)[1]<-"premium"

?


42

La nueva forma recomendada de hacer esto es usar la setNamesfunción. Ver ?setNames. Dado que esto crea una nueva copia del data.frame, asegúrese de asignar el resultado al original data.frame, si esa es su intención.

data_frame <- setNames(data_frame, c("premium","change","newprice"))

Las versiones más recientes de R te avisarán si usas colnames algunas de las formas sugeridas por las respuestas anteriores.

Si esto fuera un data.tablelugar, podría usar la data.tablefunción setnames, que puede modificar nombres de columna específicos o un solo nombre de columna por referencia :

setnames(data_table, "old-name", "new-name")

2
creo que se le pidió data.frame, no data.table
Helix123

35

Tuve el mismo problema y este código funcionó para mí.

names(data)[names(data) == "oldVariableName"] <- "newVariableName"

En resumen, este código hace lo siguiente:

names(data)examina todos los nombres en el marco de datos ( data)

[names(data) == oldVariableName]extrae el nombre de variable ( oldVariableName) que desea renombrar y <- "newVariableName"asigna el nuevo nombre de variable


¿Cómo funcionaría esto si tuviera un vector con, por ejemplo, 3 oldVariableNames?
jiggunjer

Exactamente lo que estaba buscando -> ¡2 pulgares arriba!
SilSur

19

Similar a los demás:

cols <- c("premium","change","newprice")
colnames(dataframe) <- cols

Bastante simple y fácil de modificar.


10

tratar:

names(newprice) <- c("premium", "change", "newprice")

10

Si necesita renombrar no todas las columnas, sino varias, a la vez, cuando solo conoce los nombres de las columnas anteriores, puede usar la colnamesfunción y el %in%operador. Ejemplo:

df = data.frame(bad=1:3, worse=rnorm(3), worst=LETTERS[1:3])

   bad      worse    worst
1   1 -0.77915455       A
2   2  0.06717385       B
3   3 -0.02827242       C

Ahora desea cambiar "malo" y "peor" a "bueno" y "mejor". Puedes usar

colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")

Esto resulta en

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C

1
Ese código supone que el orden de los nombres de sus columnas es igual al orden de los insertos
Hillary Sanders

10

Use esto para cambiar el nombre de la columna por la función colname.

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"

8

Puedes hacer la edición de la siguiente manera:

newprice <- edit(newprice)

y cambie el nombre de la columna manualmente.


¿No funciona esto solo para elementos vectoriales y factoriales? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
vagabundo

Funciona para marcos de datos al menos. Eso es lo que se.
Baykal

7

Los nombres de mi columna son los siguientes

colnames(t)
[1] "Class"    "Sex"      "Age"      "Survived" "Freq" 

Quiero cambiar el nombre de la columna de Clase y Sexo

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")

7

Hay un par de opciones con dplyr::rename()y dplyr::select():

library(dplyr)

mtcars %>% 
  tibble::rownames_to_column('car_model') %>%                            # convert rowname to a column. tibble must be installed.
  select(car_model, est_mpg = mpg, horse_power = hp, everything()) %>%   # rename specific columns and reorder
  rename(weight = wt, cylinders = cyl) %>%                               # another option for renaming specific columns that keeps everything by default
  head(2)
      car_model est_mpg horse_power cylinders disp drat weight  qsec vs am gear carb
1     Mazda RX4      21         110         6  160  3.9  2.620 16.46  0  1    4    4
2 Mazda RX4 Wag      21         110         6  160  3.9  2.875 17.02  0  1    4    4

También hay tres variantes de ámbito dplyr::rename(): dplyr::rename_all()para todos los nombres de columna, dplyr::rename_if()para orientar condicionalmente los nombres de columna y dplyr::rename_at()para seleccionar columnas con nombre. El siguiente ejemplo reemplaza espacios y puntos con un guión bajo y convierte todo a minúsculas:

iris %>%  
  rename_all(~gsub("\\s+|\\.", "_", .)) %>% 
  rename_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

dplyr::select_all() También se puede utilizar de manera similar:

iris %>%  
  select_all(~gsub("\\s+|\\.", "_", .)) %>% 
  select_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

6

Solo para corregir y extender ligeramente la respuesta de Scott Wilson.
Puedes usar data.table'ssetnames función data.table en data.frames.

No espere acelerar la operación, pero puede esperar setnamesque sea más eficiente para el consumo de memoria, ya que actualiza los nombres de columna por referencia. Esto se puede rastrear con la addressfunción, ver más abajo.

library(data.table)
set.seed(123)
n = 1e8

df = data.frame(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(df)
#[1] "0x208f9f00"
colnames(df) <- c("good", "better")
address(df)
#[1] "0x208fa1d8"
rm(df)

dt = data.table(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(dt)
#[1] "0x535c830"
setnames(dt, c("good", "better"))
address(dt)
#[1] "0x535c830"
rm(dt)

Entonces, si está alcanzando sus límites de memoria, puede considerar usar este en su lugar.


3

Esto puede ser útil:

rename.columns=function(df,changelist){
  #renames columns of a dataframe
  for(i in 1:length(names(df))){
    if(length(changelist[[names(df)[i]]])>0){
      names(df)[i]= changelist[[names(df)[i]]]
    }
  }
  df
}

# Specify new dataframe
df=rename.columns(df,list(old.column='new.column.name'))

1

En caso de que tengamos 2 marcos de datos, los siguientes trabajos

 DF1<-data.frame('a', 'b')
 DF2<-data.frame('c','d')

Cambiamos los nombres de DF1 de la siguiente manera

 colnames(DF1)<- colnames(DF2)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.