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?

Hijo
fuente
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"
Dirk Eddelbuettel
fuente
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"
Matheus Abreu
fuente
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).

Joshua Ulrich
fuente
51

¿Intentaste solo:

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

?

Jamie
fuente
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")
Scott C Wilson
fuente
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

Desta Haileselassie Hagos
fuente
¿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.

Adam Erickson
fuente
10

tratar:

names(newprice) <- c("premium", "change", "newprice")
ngamita
fuente
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
discipulo
fuente
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"
Sophanna
fuente
8

Puedes hacer la edición de la siguiente manera:

newprice <- edit(newprice)

y cambie el nombre de la columna manualmente.

Baykal
fuente
¿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")
Mehul Katara
fuente
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
sbha
fuente
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.

jangorecki
fuente
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'))
Chris
fuente
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)
Raghavan vmvs
fuente