Как переименовать один столбец в data.frame?

238

Я знаю, если у меня есть кадр данных с более чем 1 столбцом, я могу использовать

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

чтобы переименовать столбцы. Как это сделать, если это только один столбец? Значение вектора или кадра данных с одним столбцом в нем.

Пример:

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
    Решение @ aix будет работать для 1-колоночного data.frame. Возможно, вас смущает аргумент drop=TRUE умолчанию для [ , который приводит к преобразованию объекта «1 столбец» в вектор ... и векторы не имеют colnames . Пример того, что вы попробовали, был бы очень полезен.
  • 2
    это работает, если вы используете "colnames (x) [1] <- 'newname2'"
Теги:

14 ответов

271
Лучший ответ
colnames(trSamp)[2] <- "newname2"

пытается установить второе имя столбца. Ваш объект имеет только один столбец, поэтому команда выдает ошибку. Этого должно быть достаточно:

colnames(trSamp) <- "newname2"
  • 1
    . @ JoshuaUlrich - Похоже, это не работает, если имя столбца выглядит примерно так: "A,B,C,X,Y,Z" где я хочу переименовать его в Y используя testData[379] <- "Y" .
466

Это обобщенный способ, в котором вам не нужно запоминать точное местоположение переменной:

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

Этот код в значительной степени делает следующее:

  • names(df) просматривает все имена в df
  • [names(df) == old.var.name] извлекает имя переменной, которое вы хотите проверить.
  • <- 'new.var.name' назначает новое имя переменной.
  • 4
    Я также довольно новый с R, любил это решение! Я на самом деле проверил, что он делает, и я думаю, что стоит указать, что [names(df) == old.var.name] самом деле возвращает вектор со значениями true / false. Таким образом, он может изменить несколько имен столбцов, если, например, используются регулярные выражения.
  • 3
    Для результатов регулярного выражения используйте что-то вроде names(df) = sub('pattern', 'replacement', names(df)) . В противном случае вы пытаетесь установить несколько столбцов с одинаковым именем.
Показать ещё 6 комментариев
74
colnames(df)[colnames(df) == 'oldName'] <- 'newName'
  • 1
    Мне нравится это решение, так как вы можете ссылаться на имя столбца по имени, в отличие от необходимости знать, какой это номер столбца. Лучше для большего числа функций.
  • 1
    У меня есть небольшое дополнение к вопросу и этому ответу. У меня есть датафрейм со столбцом, в котором есть буквы «snp» . Я хочу переименовать его в «Маркер» . Но я хочу использовать регулярное выражение для этого. Очевидно, что мой код имеет недостатки: colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] <- "Marker" , поскольку столбец не переименован. Если я names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] <- "Marker" переименован. Что мне не хватает?
58

Это старый вопрос, но стоит отметить, что теперь вы можете использовать setnames из пакета data.table.

library(data.table)

setnames(DF, "oldName", "newName")

# or since the data.frame in question is just one column: 
setnames(DF, "newName")

# And for reference sake, in general (more than once column)
nms <- c("col1.name", "col2.name", etc...)
setnames(DF, nms)
  • 1
    или setNames из базы R.
46

Это также можно сделать с помощью пакета Hadley plyr и функции rename.

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

Вы можете переименовать имя (не зная положения) и выполнить сразу несколько переименований. Например, после слияния вы можете:

  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

Что вы можете переименовать за один шаг, используя:

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
  • 5
    rename теперь также является функцией в пакете dplyr .
  • 2
    Форматы dplyr (v0.4.3) переименовывают по-разному ... df <- переименовывать (df, samples = foo)
21

Я думаю, что лучший способ переименования столбцов - использовать пакет dplyr, например:

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

Он работает одинаково для переименования одного или нескольких столбцов в любом наборе данных.

10

Мне нравится следующий стиль для переименования имен столбцов dataframe один за другим.

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

где

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

возвращает индекс определенного столбца.

  • 1
    +1 за предоставление пользователю возможности использовать фактическое старое имя :)
  • 1
    В чем здесь разница по сравнению с решением @zongshiwujie?
Показать ещё 1 комментарий
6

Я считаю, что наиболее удобный способ переименовать один столбец - использовать 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
  • хорошо работает в трубопроводах
  • удобно, когда имена хранятся в переменных
  • работает с именем или индексом столбца
  • ясно и компактно
5

Вы можете использовать rename.vars в пакете gdata.

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

Это особенно полезно, если у вас есть несколько имен переменных для изменения или вы хотите добавить или предварительно подставить какой-либо текст в имена переменных, тогда вы можете сделать что-то вроде:

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

Пример добавления текста к подмножеству имен переменных см. в: https://stackoverflow.com/questions/15046296/how-to-append-a-string-to-subset-of-variable-names-in-r

  • 0
    Это самое простое, спасибо. Были проблемы с пакетом dplyr.
4

Try:

colnames(x)[2] <- 'newname2'
  • 8
    Это то, что вызвало ошибку, о которой спрашивал OP (в его правке). Это не сработает, так как датафрейм имеет только один столбец.
  • 0
    . @ NPE - Похоже, это не работает, если имя столбца выглядит примерно так: "A,B,C,X,Y,Z" где я хочу переименовать его в Y используя testData[379] <- "Y" .
3

Вы также можете попробовать "upData" из пакета "Hmisc".

library(Hmisc)

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

  • 0
    Очень хорошо! Также возможно переименовать больше столбцов одновременно: trSamp = upData (trSamp, rename = c (sample.trainer.index..10000. = 'Newname2, AnotherColumnName =' RenameThisColumn '))
2

Это, скорее всего, уже там, но я играл с переименованием полей при поиске решения и пробовал это по прихоти. Работал для моих целей.

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

Править начинается здесь....

Это тоже работает.

df <- rename(df, c("oldColName" = "newColName"))
  • 0
    Для того, кто пометил меня, это нормально, но, поскольку я, очевидно, новичок в этом, возможно, вы могли бы осветить, что не так с ответом.
  • 0
    В вашем ответе нет ничего плохого, кроме того, что он не был сторонником ... это был просто враждебный пользователь ТА, не имевший смелости оправдать свою истерику.
Показать ещё 2 комментария
2

Если вы знаете, что ваш фреймворк имеет только один столбец, вы можете использовать: names(trSamp) <- "newname2"

0

Я просто добавил бы новый столбец во фрейм данных с нужным именем и получил бы данные для него из существующего столбца. как это:

dataf$value=dataf$Article1Order

тогда я уберу старую колонку! как это:

dataf$Article1Order<-NULL

Этот код может показаться глупым! Но это работает отлично...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню