Tengo una estructura de datos llamada «nuevoprecio» (ver más abajo) y quiero cambiar los nombres de columna en mi programa en el R.

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

De hecho 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 a ser diferente como se puede ver.

Cuando me pegue mi programa en R de la consola esta es la salida 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(“"

Asimismo, he intentado usar el c() función-por ejemplo c("premium"), en lugar de la paste() función, pero fue en vano.

Podría alguien ayudarme a resolver esto?

  • Si Dirk la respuesta de obras, a continuación, el problema era que estaba trabajando con una matriz en lugar de con un dataframe. Usted puede comprobar esto con is.matrix o str.
  • Ver esta respuesta en dplyr::cambiar el nombre de stackoverflow.com/a/26146202/1831980
  • colnames(newprice)<- c("premium","change","newprice")
InformationsquelleAutor Son | 2011-05-21

16 Comentarios

  1. 547

    Utilizar el 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 puede subconjunto:

    R> colnames(X)[2] <- "superduper"
    • ¿Por qué no usar nombres() en lugar de colnames()?
    • Genial!!! También puede subconjunto varias columnas a la vez (útil en grandes marcos de datos). colnames(X)[c(1,2)] <- c("good", "better")
    • Trate de setnames() en el data.table paquete. Usar algo como setnames(DT,"b","B") o setnames(DT,c("a","E"),c("A","F"))
    • Extrañamente, después de establecer los nombres de columna de la trama de datos q1, tratando de mutar el marco de datos utilizando dplyr como en q1 <- q1 %>% mutate(rel_count = count / 482462) resultados en el error Error in mutate_impl(.data, dots) : unknown column 'days' (donde days es un nuevo nombre que se da a la columna). Esto es muy frustrante.
  2. 155

    Yo uso este:

    colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
    • Gracias. Creo que esto de alguna manera está molesto con R: ¿por Qué es tan difícil cambiar el nombre de la columna si usted no desea utilizar el número de índice, pero el nombre antiguo 🙁
    • usted no necesita la which en ese comando
    • Este método tiene la ventaja de que usted no tiene que preocuparse acerca de la posición de la columna, siempre y cuando usted sabe su nombre original. Creo que este es el método preferido como usted puede – más tarde – realizar cambios en el código que cambiar la posición de la columna que desee cambiar el nombre.
  3. 74

    El error es causado por el «smart-comillas» (o como se llamen). La lección aquí es que, «no hay que escribir el código en un ‘editor’ que convierte ofertas para smart-comillas».

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

    También, usted no necesita paste("premium") (la llamada a la paste es redundante) y es una buena idea para poner en torno a los espacios <- para evitar confusiones (por ejemplo,x <- -10; if(x<-3) "hi" else "bye"; x).

  4. 36

    La nueva forma recomendada de hacerlo es utilizar el setNames función. Ver
    ?setNames. Ya que esto crea una nueva copia de la data.frame, asegúrese de asignar el resultado a la original data.frame, si esa es su intención.

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

    Nuevas versiones de R le dará advertencia si utiliza colnames en algunas de las formas sugeridas por las respuestas anteriores.

    Si esto fuera un data.table en su lugar, puede utilizar el data.table función setnames, lo cual puede modificar específicas de los nombres de columna o una sola columna nombre por referencia:

    setnames(data_table, "old-name", "new-name")
    • creo que fue preguntado por los datos.marco, no de datos.tabla
    • funciona de la solución para los datos.marco demasiado
  5. 30

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

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

    En breve, este código hace lo siguiente:

    names(data) se ve en todos los nombres en el dataframe (data)

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

    • ¿cómo sería el trabajo, si usted tenía un vector, por ejemplo, con 3 oldVariableNames?
  6. 16

    Similar a la de los demás:

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

    Bastante simple y fácil de modificar.

  7. 10

    Si necesita cambiar el nombre no todos, pero por varias columnas a la vez, cuando sólo se conocen el viejo nombres de columna se puede utilizar colnames función y %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 los «malos» y los «peores» a «bueno» y «lo mejor». Usted puede utilizar

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

    Esto se traduce en

      good      worse  best
    1    1 -0.6010363    A
    2    2  0.7336155    B
    3    3  0.9435469    C
    • Que el código que se supone que el orden de los nombres de columna igual el orden de los insertos
  8. 7

    Puedes hacer la edición:

    newprice <- edit(newprice)

    y cambiar el nombre de la columna manualmente.

    • No es este trabajo sólo para que el vector y el factor de elementos? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
    • Funciona para los marcos de datos por lo menos. Que es lo que yo sé.
  9. 6

    Sólo para corregir y amplían un poco de Scott Wilson respuesta.

    Se pueden utilizar los datos.tabla setnames función de los datos.marcos también.

    No esperar que la velocidad de la operación, pero se puede esperar que el setnames para ser más eficiente para el consumo de memoria, ya que actualiza los nombres de columna por referencia. Esto puede ser rastreado con address función, consulte a continuación.

    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)

    Así que si usted está golpeando sus límites de memoria, usted puede considerar el uso de este lugar.

  10. 5

    Mi columna de los nombres es la siguiente

    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")
  11. 4

    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 ámbito de las variantes de dplyr::rename(): dplyr::rename_all() para todos los nombres de columna, dplyr::rename_if() para condicionalmente la orientación de los nombres de columna, y dplyr::rename_at() para seleccionar columnas nombradas. El siguiente ejemplo se reemplazan los espacios y períodos con un carácter de subrayado y convierte todo en 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 puede ser utilizado en una 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
  12. 2

    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'))
  13. 2

    Utilice esta opción para cambiar el nombre de la columna por colname función.

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

    En el caso de que tenemos 2 dataframes las siguientes obras

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

    Cambiamos los nombres de DF1 como sigue

     colnames(DF1)<- colnames(DF2)

Dejar respuesta

Please enter your comment!
Please enter your name here