Como renomear uma única coluna em um data.frame?


335

Sei que tenho um quadro de dados com mais de uma coluna, posso usar

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

renomear as colunas. Como faço isso se for apenas uma coluna? Significa um vetor ou quadro de dados com apenas uma coluna.

Exemplo:

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]

4
A solução do @ aix funcionará para um data.frame de 1 coluna. Você provavelmente está confundido com o drop=TRUEargumento padrão para [, que faz com que um objeto "1 coluna" seja convertido em um vetor ... e os vetores não possuem colnames. Um exemplo do que você tentou seria muito útil.
Joshua Ulrich

2
funciona se você usar "colnames (x) [1] <- 'newname2'" "
screechOwl

Respostas:


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

tenta definir o nome da segunda coluna. Seu objeto possui apenas uma coluna; portanto, o comando gera um erro. Isso deve ser suficiente:

colnames(trSamp) <- "newname2"

11
@ JoshuaUlrich - Isso parece não funcionar se o nome da coluna for algo como "A,B,C,X,Y,Z"onde eu quero renomeá-lo para Yuso testData[379] <- "Y".
Chetan Arvind Patil

576

Esta é uma maneira generalizada em que você não precisa se lembrar da localização exata da variável:

# 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'

Esse código praticamente faz o seguinte:

  1. names(df) olha para todos os nomes no df
  2. [names(df) == old.var.name] extrai o nome da variável que você deseja verificar
  3. <- 'new.var.name' atribui o novo nome da variável.

5
Eu também sou muito novo com R, adorei esta solução! Na verdade, verifiquei o que ele faz e acho que vale a pena especificar que [names(df) == old.var.name]realmente retorna um vetor com valores verdadeiros / falsos. Portanto, ele pode alterar vários nomes de colunas se, por exemplo, expressões regulares forem usadas.
Mikyatope

3
Para resultados de expressões regulares, use algo como names(df) = sub('pattern', 'replacement', names(df)). Caso contrário, você tentaria definir várias colunas com o mesmo nome.
We Are All Monica

40
Sentimentos mistos ... em um mundo perfeito, onde abundam linguagens de programação perfeitas, seria realmente necessário esse número de pressionamentos de tecla para alterar o nome de uma única coluna? Eu amo R, mas às vezes eu quero estrangulá-lo por esses tipos de razões.
tumultous_rooster

4
Como não existe uma função wrapper para isso na base?
precisa saber é o seguinte

11
Como todos nós desejamos! Eu não sei sobre o agora, mas naquela época não havia nenhum invólucro da base
Side_0o_Effect

85
colnames(df)[colnames(df) == 'oldName'] <- 'newName'

2
Eu gosto dessa solução, pois você pode fazer referência ao nome da coluna por nome, em vez de precisar saber qual é a coluna numérica. Melhor para recursos de maior número.
Cybernetic

11
Eu tenho uma pequena extensão para a pergunta e esta resposta. Eu tenho um quadro de dados com uma coluna que contém as letras 'snp' . Quero renomeá-lo para 'Marcador' . Mas eu quero usar uma expressão regular para fazer isso. Aparentemente, o código que tenho é defeituoso:, colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] <- "Marker"porque a coluna não é renomeada. Se eu fizer names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] <- "Marker"isso é renomeado. o que estou perdendo?
Sander W. van der Laan

76

Esta é uma pergunta antiga, mas vale a pena notar que agora você pode usar setnameso data.tablepacote.

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)

6
ou a setNamespartir da base R.
PatrickT

53

Isso também pode ser feito usando o plyrpacote de Hadley e a renamefunção

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

Você pode renomear pelo nome (sem saber a posição) e executar várias renomeações de uma só vez. Após fazer uma mesclagem, por exemplo, você pode acabar com:

  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 você pode renomear em uma etapa 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

7
renameagora também é uma função no dplyrpacote.
Sam Firke

36

Eu acho que a melhor maneira de renomear colunas é usando o pacote dplyr assim:

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

Funciona da mesma maneira para renomear uma ou várias colunas em qualquer conjunto de dados.


12

Eu gosto do próximo estilo para renomear os nomes das colunas do quadro de dados, um por um.

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

Onde

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

retorna pelo índice da coluna específica.


11
+1 para dar ao usuário a chance de usar o antigo nome real :)

11
Qual é a diferença aqui em comparação com a solução de @zongshiwujie?
precisa saber é

which()não é necessário.
sindri_baldur

12

Acho que a maneira mais conveniente de renomear uma única coluna é usando 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 bem em cadeias de tubos
  • conveniente quando nomes são armazenados em variáveis
  • trabalha com um nome ou um índice de coluna
  • claro e compacto

6

Você pode usar o rename.varsno gdatapacote.

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

Isso é particularmente útil quando você tem mais de um nome de variável para alterar ou deseja acrescentar ou adicionar um texto aos nomes das variáveis, e pode fazer algo como:

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

Para obter um exemplo de anexar texto a um subconjunto de nomes de variáveis, consulte: https://stackoverflow.com/a/28870000/180892


Este é o mais fácil, obrigado. Teve problemas com o pacote dplyr.
DannyB

4

Tentar:

colnames(x)[2] <- 'newname2'

8
Foi isso que gerou o erro sobre o qual o OP perguntou (em sua edição). Não funcionará, pois o quadro de dados possui apenas uma coluna.

. @ NPE - Isso parece não funcionar se o nome da coluna for algo como "A,B,C,X,Y,Z"onde eu quero renomeá-la para Yuso testData[379] <- "Y".
Chetan Arvind Patil

4

Provavelmente, isso já existe, mas eu estava brincando com a renomeação de campos enquanto procurava uma solução e tentei por um capricho. Trabalhei para meus propósitos.

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

A edição começa aqui ....

Isso também funciona.

df <- rename(df, c("oldColName" = "newColName"))

Para quem me marcou, tudo bem, mas como sou obviamente novo nisso, talvez você possa esclarecer o que estava errado com a resposta.
21375 Scottieie #

Não há nada de errado com sua resposta, além de não ser um oneliner. Esse foi apenas um usuário SO hostil que não teve coragem de justificar sua birra.
count0

Obrigado @ count0. Na verdade, é significativo ter alguns pontos de mana ou qualquer outra coisa para comentar sobre uma pergunta, algo que ainda não consegui fazer. Em alguns casos, as perguntas de acompanhamento seriam legais, pois eu aprendi uma nova qualificação. Novamente. TY.
21717 Scott Scottie

11
precisamos dar o nome de todas as colunas para usar isso.
Arpit Sisodia

De qual pacote vem a renamefunção?
Diego

3

Se você sabe que seu quadro de dados possui apenas uma coluna, você pode usar: names(trSamp) <- "newname2"


3

Você também pode tentar 'upData' no pacote 'Hmisc'.

library(Hmisc)

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


Muito agradável! Também é possível renomear mais colunas de uma vez: trSamp = upData (trSamp, renomear = c (sample.trainer.index..10000. = 'Newname2, AnotherColumnName =' RenameThisColumn '))
FraNut

0

A pergunta do OP foi bem e verdadeiramente respondida. No entanto, aqui está um truque que pode ser útil em algumas situações: correspondência parcial do nome da coluna, independentemente de sua posição em um dataframe:

Correspondência parcial no nome:

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

Outro exemplo: correspondência parcial na presença de "pontuação":

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

Estes foram exemplos com os quais tive que lidar hoje, pensei que valeria a pena compartilhar.



0

Podemos usar rename_withpara renomear colunas com uma função ( stringrfunções, por exemplo).

Considere os seguintes dados 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" 

Renomeie todas as variáveis com 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"

Renomeie por partículas nome com alguns dplyrverbos ( starts_with, ends_with, contains, matches, ...).

Exemplo com .( xvariáveis):

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"

Renomeie pela classe com muitas funções de teste de classe, como is.integer, is.numeric, is.factor...

Exemplo com 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"

O aviso:

Mensagens de aviso: 1: Em stri_replace_first_regex (string, padrão, fix_replacement (substituto),: o comprimento maior do objeto não é um múltiplo do menor tamanho 2: Nos nomes [cols] <- .fn (names [cols], ...) : número de itens a serem substituídos não é um múltiplo de comprimento de substituição

Não é relevante, pois é apenas uma inconsistência seq_along(.)com a função de substituição.


-1

Eu simplesmente adicionaria uma nova coluna ao quadro de dados com o nome que eu quero e obteria os dados da coluna existente. como isso:

dataf$value=dataf$Article1Order

então eu removo a coluna antiga! como isso:

dataf$Article1Order<-NULL

Esse código pode parecer bobo! Mas funciona perfeitamente ...


-1

Eu simplesmente mudaria o nome de uma coluna para o conjunto de dados com o novo nome que desejo com o seguinte código: names (dataset) [index_value] <- "new_col_name"


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.