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

2
він працює, якщо ви використовуєте "colnames (x) [1] <- 'newname2'"
screechOwl

Відповіді:


344
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]насправді повертає вектор з істинними / хибними значеннями. Таким чином, він може змінити кілька імен стовпців, якщо, наприклад, використовуються регулярні вирази.
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з бази Р.
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

Мені подобається наступний стиль для перейменування назв стовпців кадру даних по одному.

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

де

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

повертає за індексом конкретного стовпця.


1
+1 за надання користувачеві шансу скористатися фактичним старим іменем :)

1
У чому тут різниця порівняно з рішенням @zongshiwujie?
buhtz

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
Це те, що кинуло помилку, про яку запитав ОП (у своїй редакції). Він не працюватиме, оскільки у фрейму даних є лише один стовпець.

. @ 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

У вашій відповіді немає нічого поганого, окрім того, що він не був онлайнером .. це був просто ворожий користувач ТА, який не мав сміливості виправдати свою істерику.
count0

Дякуємо @ count0. Насправді є сенс мати деякі точки мани або що б там не було, коментувати питання, що я ще мав змогу зробити. Подальше запитання в деяких випадках було б непогано, коли я вивчаю новий набір навичок. Знову. TY.
Scottieie

1
нам потрібно дати ім'я всіх стовпців, щоб використовувати це.
Arpit Sisodia

з якого пакета 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 =' Перейменувати цю колонку '))
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 (імена [cols], ...) : кількість елементів для заміни не кратна довжині заміни

Це не актуально, оскільки це лише невідповідність seq_along(.)функції заміни.


-1

Я просто додав би новий стовпець у кадр даних із потрібним ім'ям і отримав би дані для нього з існуючого стовпця. подобається це:

dataf$value=dataf$Article1Order

тоді я видаляю стару колонку! подобається це:

dataf$Article1Order<-NULL

Цей код може здатися дурним! Але це працює чудово ...


-1

Я б просто змінив ім'я стовпця до набору даних на нове ім'я, яке я хочу, з таким кодом: імена (набір даних) [index_value] <- "new_col_name"


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.