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


335

Я знаю, если у меня есть фрейм данных с более чем 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 будет работать для data.frame с 1 столбцом. Возможно, вас смущает заданный по drop=TRUEумолчанию аргумент to [, который приводит к тому , что объект «1 столбец» преобразуется в вектор ... а векторы не имеют colnames. Пример того, что вы попробовали, был бы очень полезен.
— Джошуа Ульрих

2
это работает, если вы используете "colnames (x) [1] <- 'newname2'"
— screechOwl

Ответы:


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

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

colnames(trSamp) <- "newname2"

1
. @ JoshuaUlrich - Это не похоже на работу , если имя столбца что - то вроде , "A,B,C,X,Y,Z"где я хочу , чтобы переименовать его в Yиспользовании testData[379] <- "Y".
— Четан Арвинд Патил

576

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

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

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

  1. names(df) смотрит на все имена в df
  2. [names(df) == old.var.name] извлекает имя переменной, которую вы хотите проверить
  3. <- 'new.var.name' назначает новое имя переменной.

5
Я также довольно новый с R, любил это решение! Я на самом деле проверил, что он делает, и я думаю, что стоит указать, что на [names(df) == old.var.name]самом деле возвращает вектор со значениями true / false. Таким образом, он может изменить несколько имен столбцов, если, например, используются регулярные выражения.
— Mikyatope

3
Для результатов регулярного выражения используйте что-то вроде names(df) = sub('pattern', 'replacement', names(df)). В противном случае вы пытаетесь установить несколько столбцов с одинаковым именем.
— Мы все Моника

40
Смешанные чувства ... в идеальном мире, где изобилуют совершенные языки программирования, действительно ли потребуется так много нажатий клавиш, чтобы изменить имя одного столбца? Я люблю R, но иногда я хочу задушить его по этим причинам.
— tumultous_rooster

4
Как там не обёртка для этого в базе?
— ifly6

1
Как мы все желаем! Я не знаю сейчас, но тогда в базе не было никакой обертки
— Side_0o_Effect

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

2
Мне нравится это решение, поскольку вы можете ссылаться на имя столбца по имени, в отличие от необходимости знать, какой это номер столбца. Лучше для большего числа функций.
— Кибернетический

1
У меня есть небольшое расширение вопроса и этого ответа. У меня есть датафрейм со столбцом, в котором есть буквы «snp» . Я хочу переименовать его в «Маркер» . Но я хочу использовать для этого регулярное выражение . Видимо код, который я имею, имеет недостатки:, colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] <- "Marker"поскольку столбец не переименован. Если я names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] <- "Marker"это будет переименован. Чего мне не хватает?
— Сандер В. ван дер Лаан

76

Это старый вопрос, но стоит отметить, что теперь вы можете использовать его 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's sake, in general (more than once column)
nms <- c("col1.name", "col2.name", etc...)
setnames(DF, nms)

6
или setNamesс базы R.
— PatrickT

53

Это также можно сделать с помощью 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

7
renameтеперь также является функцией в dplyrпакете.
— Сэм Фирке

36

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

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

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


12

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

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

где

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

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


1
+1 за предоставление пользователю возможности использовать действительное старое имя :)

1
В чем здесь разница по сравнению с решением @zongshiwujie?
— Бахц

which()не обязательно.
— sindri_baldur

12

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

6

Вы можете использовать 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/a/28870000/180892.


Это самое простое, спасибо. Были проблемы с пакетом dplyr.
— DannyB

4

Пытаться:

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

8
Это то, что вызвало ошибку, о которой спрашивал OP (в его правке). Это не сработает, так как датафрейм имеет только один столбец.

. @ NPE - Это не похоже на работу , если имя столбца что - то вроде , "A,B,C,X,Y,Z"где я хочу , чтобы переименовать его в Yиспользовании testData[379] <- "Y".
— Четан Арвинд Патил

4

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

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

Редактирование начинается здесь ....

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

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

Для того, кто пометил меня, это нормально, но, поскольку я, очевидно, новичок в этом, возможно, вы могли бы осветить, что не так с ответом.
— Скотти

В вашем ответе нет ничего плохого, кроме того, что он не был сторонником ... это был просто враждебный пользователь SO, у которого не хватило смелости оправдать свою истерику.
— считать

Спасибо @ count0. На самом деле имеет смысл иметь какие-то очки маны или что-то еще, чтобы комментировать вопрос, что я еще не смог сделать. Следующие вопросы в некоторых случаях были бы хорошими, поскольку я изучаю новый набор навыков. Очередной раз. TY.
— Скотти

1
нам нужно дать имя всем столбцам, чтобы использовать это.
— Арпит Сисодия

из какого пакета взята renameфункция?
— Диего

3

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


3

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

library(Hmisc)

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


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

0

Вопрос ОП был хорошо и верно ответил. Однако вот прием, который может быть полезен в некоторых ситуациях: частичное совпадение имени столбца, независимо от его положения в кадре данных:

Частичное совпадение по названию:

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

Другой пример: частичное совпадение на наличие «пунктуации»:

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

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


0

Мне colnames()легче поспорить https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/row%2Bcolnames

выберите некоторый столбец из фрейма данных

df <- data.frame(df[, c( "hhid","b1005", "b1012_imp", "b3004a")])

и переименуйте выбранный столбец по порядку,

colnames(df) <- c("hhid", "income", "cost", "credit")

проверьте имена и значения, чтобы быть уверенным

names(df);head(df)

0

Мы можем использовать rename_withдля переименования столбцов с помощью функции ( stringrнапример, функции).

Рассмотрим следующие данные 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" 

Переименуйте все переменные с помощью 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"

Переименовать имя частицы с некоторыми dplyrглаголами ( starts_with, ends_with, contains, matches, ...).

Пример с .( xпеременными):

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"

Переименовать класс с большим количеством функций тестирования класса, как is.integer, is.numeric, is.factor...

Пример с 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"

Предупреждение:

Предупреждающие сообщения: 1: в stri_replace_first_regex (строка, шаблон, fix_replacement (замена): длинная длина объекта не кратна короткой длине объекта 2: в именах [cols] <- .fn (names [cols], ...) : количество заменяемых элементов не кратно длине замены

Это не имеет значения, так как это просто несоответствие seq_along(.)функции замены.


-1

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

dataf$value=dataf$Article1Order

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

dataf$Article1Order<-NULL

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


-1

Я просто изменил бы имя столбца на набор данных с новым желаемым именем со следующим кодом: names (набор данных) [index_value] <- "new_col_name"


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.