Menu

Как переименовать столбцы в R (names, colnames, dplyr rename)

Переименование столбцов датафрейма в R: names() и colnames(), переименование по позиции и по имени, setNames(), dplyr rename() и очистка грязных импортированных заголовков.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Сначала посмотрите на имена: names() и colnames()

Имена столбцов живут в атрибуте, который можно читать как любой вектор. И names(), и colnames() возвращают его для датафрейма:

Один и тот же ответ. Единственное настоящее отличие: colnames() работает ещё и на матрицах, а names() — нет, поэтому универсальный код использует colnames(). Для повседневных датафреймов они взаимозаменяемы.

Ключевая мысль для всего дальнейшего: переименование столбца — это присваивание в этот вектор. Специальной базовой функции нет; вы изменяете names(df) той же индексацией, что и любой вектор.

Переименование по позиции (работает, но хрупко)

Проиндексируйте вектор имён по позиции и присвойте:

Столбец 2 теперь price. Годится для быстрой интерактивной правки — и является ловушкой в скрипте. Позиции — это обещание насчёт порядка столбцов, а порядок столбцов самая нестабильная вещь в импортированных данных: в день, когда читаемый вами CSV обзаведётся лишним столбцом, names(df)[2] молча переименует не тот. Если скрипт переименовывает по позиции, изменение схемы ломает его без всякого сообщения об ошибке.

Переименование по имени (надёжная базовая идиома)

Сопоставляйте старое имя вместо того, чтобы доверять позиции:

Читайте сначала внутреннюю часть: names(sales) == "prc" даёт FALSE TRUE FALSE — логическую маску по вектору имён. Индексация ею выбирает подходящую запись, а присваивание её заменяет. Если "prc" там нет, ничто не совпадёт и ничто не изменится (без ошибки — так что проверяйте результат). Эта идиома переживает перестановку столбцов, добавление новых и копирование в другие скрипты. Запомните её; это ответ базового R на вопрос «как переименовать столбец».

Несколько сразу

Заменяйте вектор целиком, когда именуете каждый столбец (частый случай сразу после импорта), или используйте match(), чтобы переименовать выбранное подмножество:

match(old, names(df)) возвращает позиции старых имён, поэтому новые имена попадают ровно туда, где были старые, — безопасно к порядку, как и идиома для одного имени. Если какого-то старого имени нет, match() вернёт NA, и присваивание выдаст ошибку, — а это как раз тот тип отказа, который нужен: громкий.

setNames() для конвейеров

Все идиомы выше изменяют переменную в два шага. setNames(object, names) возвращает переименованную копию одним выражением, а это то, что нужно конвейеру:

Удобно, когда функция возвращает безымянный или плохо названный фрейм и вы хотите поправить это по ходу — read_something() |> setNames(c("id", "value")) — без временной переменной.

Способ dplyr: rename() и rename_with()

rename() из dplyr принимает пары new = old — новое имя первым, и все хоть раз путают порядок (сниппет статичный; песочница выполняет только базовый R):

library(dplyr)

sales |> rename(price = prc, qty = q)

Старые имена, не затронутые вызовом, сохраняются как есть, а неверно написанное старое имя даёт жёсткую ошибку вместо тихого бездействия — настоящее улучшение по сравнению с базовой идиомой. Для переименования по правилу, а не по паре, rename_with() применяет функцию к именам:

sales |> rename_with(toupper)                          # every column
sales |> rename_with(toupper, starts_with("p"))        # just some

О том, как они вписываются в семейство глаголов, см. введение в dplyr.

Очистка грязных импортированных заголовков

Реальные заголовки CSV приходят в виде "Order ID", "unit.price ($)", "2024 Total" — имена с пробелами и символами, из-за которых приходится везде брать их в обратные кавычки. Функция make.names() из базового R превращает любой символьный вектор в корректные имена R:

Корректно, но по-своему уродливо (X2024.Total). Поэтому многие команды стандартизируются на clean_names() из пакета janitor, который одним вызовом даёт аккуратный snake_case (order_id, unit_price, x2024_total): df |> janitor::clean_names(). Если вы импортируете грязные файлы еженедельно, он окупается немедленно.

Что вы уносите с собой

  • Имена столбцов — это просто вектор: читайте их через names()/colnames(), переименовывайте присваиванием в него.
  • names(df)[2] <- "new" хрупко; names(df)[names(df) == "old"] <- "new" — идиома, которую стоит запомнить.
  • match() переименовывает несколько по имени; setNames() переименовывает прямо в конвейере.
  • rename(new = old) из dplyr выдаёт ошибку при отсутствии имён (это хорошо), а rename_with() переименовывает по правилу.
  • Для грязных импортированных заголовков: make.names() в базовом R, janitor::clean_names() ради красивого результата.

Дальше: сортировка — sort() для векторов, приём с order() для датафреймов и arrange().

Часто задаваемые вопросы

Как переименовать столбец в R?

Надёжная базовая идиома — сопоставление по имени: names(df)[names(df) == "old"] <- "new". Она находит столбец с именем old, где бы он ни стоял, и переименовывает его. В dplyr это rename(df, new = old) — обратите внимание на порядок: новое имя первым.

В чём разница между names() и colnames()?

На датафрейме — никакой практической: обе читают и задают имена столбцов. colnames() работает ещё и на матрицах (где names() не работает), поэтому код, рассчитанный на оба случая, обычно использует colnames(). На обычных датафреймах пользуйтесь любой.

Как переименовать столбец по позиции в R?

Присвойте в вектор имён на этой позиции: names(df)[2] <- "price" переименует второй столбец. Это работает, но хрупко — в день, когда добавится столбец или в CSV изменится их порядок, позиция 2 будет уже другим столбцом. Предпочитайте переименование по имени.

Как переименовать несколько столбцов сразу в R?

Присвойте вектор целиком: names(df) <- c("id", "name", "price") заменит все имена по порядку. Чтобы переименовать выборочные столбцы по имени, используйте match(): names(df)[match(c("old1", "old2"), names(df))] <- c("new1", "new2"). В dplyr: rename(df, new1 = old1, new2 = old2).

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ