Alterando nomes de colunas de um quadro de dados

399

Eu tenho um quadro de dados chamado "newprice" (veja abaixo) e quero alterar os nomes das colunas no meu programa em R.

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

De fato, é isso que estou fazendo:

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

Não coloquei isso em loop porque quero que o nome de cada coluna seja diferente, como você vê.

Quando colo meu programa no console do R, esta é a saída que ele me fornece:

> 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(“"

Tentei igualmente usar a c()função - por exemplo c("premium"), em vez da paste()função, mas sem sucesso.

Alguém poderia me ajudar a descobrir isso?

Filho
fonte
Se a resposta de Dirk funcionar, o problema é que você estava trabalhando com uma matriz e não com um quadro de dados. Você pode verificar isso com is.matrixou str.
IRTFM 21/05
3
Veja esta resposta em dplyr :: renomeação stackoverflow.com/a/26146202/1831980
Rasmus Larsen
8
colnames(newprice)<- c("premium","change","newprice")
Tung Nguyen
Seu erro não tem nada a ver com a qualidade do seu código. Você está apenas usando o símbolo errado. Este "não é reconhecido por R, use" em vez disso. Eu sei que eles podem ter a mesma aparência. Olhe de perto: "". É isso aí.
Edo

Respostas:

595

Use a colnames()função:

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

Você também pode definir um subconjunto:

R> colnames(X)[2] <- "superduper"
Dirk Eddelbuettel
fonte
12
@Dirk Por que não usar names () em vez de colnames ()?
Antoine Lizée 10/10
4
Ótimo! Você também pode subconjunto de várias colunas de uma só vez (útil em grandes quadros de dados). colnames(X)[c(1,2)] <- c("good", "better")
Metakermit 13/11/2013
7
Experimente setnames()no data.tablepacote. Use algo como setnames(DT,"b","B")ousetnames(DT,c("a","E"),c("A","F"))
dwstu
Estranhamente, depois de definir os nomes do quadro de dados de coluna q1, tentando transformar o quadro de dados usando dplyrcomo em q1 <- q1 %>% mutate(rel_count = count / 482462)resultados no erro Error in mutate_impl(.data, dots) : unknown column 'days'(onde daysé um novo nome dado à coluna). Isso é realmente frustrante.
David Tonhofer 7/02
176

Eu uso isso:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
Matheus Abreu
fonte
7
Obrigado. Eu acho que isso é de alguma forma irritante com R: Por que é tão difícil mudar o nome da coluna, se você não quiser usar o número de índice, mas o nome antigo :(
Arne
10
Esse método tem a vantagem de que você não precisa se preocupar com a posição da coluna, desde que saiba o nome original. Eu acho que esse é o método preferido, pois você pode - posteriormente - fazer alterações no código que altera a posição da coluna que deseja renomear.
Paulo S. Abreu
78

O erro é causado pelas "aspas inteligentes" (ou como elas são chamadas). A lição aqui é: "não escreva seu código em um 'editor' que converte aspas em aspas inteligentes".

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

Além disso, você não precisa paste("premium")(a chamada para pasteé redundante) e é uma boa ideia colocar espaços <-para evitar confusão (por exemplo x <- -10; if(x<-3) "hi" else "bye"; x).

Joshua Ulrich
fonte
51

Você tentou apenas:

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

?

Jamie
fonte
42

A nova maneira recomendada de fazer isso é usar a setNamesfunção Veja ?setNames. Como isso cria uma nova cópia do data.frame, certifique-se de atribuir o resultado ao original data.frame, se essa for sua intenção.

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

As versões mais recentes do R alertam você se você usar colnamesalgumas das maneiras sugeridas pelas respostas anteriores.

Se fosse esse o caso data.table, você poderia usar a data.tablefunção setnames, que pode modificar nomes de colunas específicos ou um único nome de coluna por referência :

setnames(data_table, "old-name", "new-name")
Scott C Wilson
fonte
2
acho que foi pediu data.frame, não data.table
Helix123
35

Eu tive o mesmo problema e esse código funcionou para mim.

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

Em resumo, esse código faz o seguinte:

names(data)examina todos os nomes no dataframe ( data)

[names(data) == oldVariableName]extrai o nome da variável ( oldVariableName) que você deseja renomear e <- "newVariableName"atribui o novo nome da variável.

Desta Haileselassie Hagos
fonte
como isso funcionaria se você tivesse um vetor com, por exemplo, 3 oldVariableNames?
jiggunjer
Exatamente o que eu estava procurando -> 2 polegares para cima !!
SilSur
19

Semelhante aos outros:

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

Muito simples e fácil de modificar.

Adam Erickson
fonte
10

tentar:

names(newprice) <- c("premium", "change", "newprice")
ngamita
fonte
10

Se você precisar renomear não todas, exceto várias colunas de uma só vez, quando souber apenas os nomes das colunas antigas, poderá usar a colnamesfunção e o %in%operador. Exemplo:

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

Agora você deseja alterar "ruim" e "pior" para "bom" e "melhor". Você pode usar

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

Isto resulta em

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C
discípulo
fonte
11
Esse código assume a ordem de seus nomes de coluna igual a ordenação das inserções
Hillary Sanders
10

Use isso para alterar o nome da coluna pela função colname.

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

Você pode apenas fazer a edição:

newprice <- edit(newprice)

e altere o nome da coluna manualmente.

Baykal
fonte
Isso não funciona apenas para elementos vetoriais e fatoriais? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
Vibabond
Funciona para quadros de dados pelo menos. É o que eu sei.
Baykal
7

O nome da minha coluna é como abaixo

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

Quero alterar o nome da coluna Classe e Sexo

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
Mehul Katara
fonte
7

Existem algumas opções com dplyr::rename()e 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

Há também três variantes no escopo de dplyr::rename(): dplyr::rename_all()para todos os nomes de coluna, dplyr::rename_if()para direcionar condicionalmente nomes de coluna e dplyr::rename_at()para selecionar colunas nomeadas. O exemplo a seguir substitui espaços e pontos por um sublinhado e converte tudo para 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() também pode ser usado de maneira semelhante:

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
fonte
6

Apenas para corrigir e estender um pouco a resposta de Scott Wilson.
Você também pode usar a setnamesfunção data.table em data.frames.

Não espere acelerar a operação, mas você pode esperar setnamesque seja mais eficiente para o consumo de memória, pois atualiza os nomes das colunas por referência. Isso pode ser rastreado com a addressfunção, veja abaixo.

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)

Portanto, se você estiver atingindo seus limites de memória, considere usá-lo.

jangorecki
fonte
3

Isso pode 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
fonte
1

Caso tenhamos 2 quadros de dados, os seguintes trabalhos

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

Mudamos os nomes do DF1 da seguinte maneira

 colnames(DF1)<- colnames(DF2)
Raghavan vmvs
fonte