Как переименовать один столбец в 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]
screechOwl
источник
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' назначает новое имя переменной.
Side_0o_Effect
источник
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'
zongshiwujie
источник
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
alexplanation
источник
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')

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

jshepherd
источник
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
  • хорошо работает в трубопроводах
  • удобно, когда имена хранятся в переменных
  • работает с именем или индексом столбца
  • ясно и компактно
Moody_Mudskipper
источник
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'
NPE
источник
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"))
Scottieie
источник
Для того, кто пометил меня, это нормально, но, поскольку я, очевидно, новичок в этом, возможно, вы могли бы осветить, что не так с ответом.
Скотти
В вашем ответе нет ничего плохого, кроме того, что он не был сторонником ... это был просто враждебный пользователь SO, у которого не хватило смелости оправдать свою истерику.
считать
Спасибо @ count0. На самом деле имеет смысл иметь какие-то очки маны или что-то еще, чтобы комментировать вопрос, что я еще не смог сделать. Следующие вопросы в некоторых случаях были бы хорошими, поскольку я изучаю новый набор навыков. Очередной раз. TY.
Скотти
1
нам нужно дать имя всем столбцам, чтобы использовать это.
Арпит Сисодия
из какого пакета взята renameфункция?
Диего
3

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


источник
3

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

library(Hmisc)

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

ansek
источник
Очень хорошо! Также возможно переименовать больше столбцов одновременно: 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

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

PatrickT
источник
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

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

Niloufar
источник
-1

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

Партибан М
источник
-3
library(dplyr)
rename(data, de=de.y)
Привет мир
источник
Хотите добавить немного, почему это помогает проблеме ОП?
Гийом Расикот