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

400

У меня есть фрейм данных с именем «newprice» (см. Ниже), и я хочу изменить имена столбцов в моей программе на R.

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164

На самом деле это то, что я делаю:

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice") 

Я не поместил это в цикл, потому что я хочу, чтобы каждое имя столбца было другим, как вы видите.

Когда я вставляю свою программу в консоль R, это вывод, который она дает мне:

> names(newprice)[1]<-paste(“premium”)
Error: unexpected input in "names(newprice)[1]<-paste(“"
> names(newprice)[2]<-paste(“change”)
Error: unexpected input in "names(newprice)[2]<-paste(“"
> names(newprice)[3]<-paste(“newpremium”)
Error: unexpected input in "names(newprice)[3]<-paste(“"

Я также пытался использовать c()функцию, например c("premium"), вместо paste()функции, но безрезультатно.

Может ли кто-нибудь помочь мне понять это?

Сын
источник
Если ответ Дирка сработал, то проблема заключалась в том, что вы работали с матрицей, а не с кадром данных. Вы можете проверить это с помощью is.matrixили str.
IRTFM
3
Смотрите этот ответ на dplyr :: переименуйте stackoverflow.com/a/26146202/1831980
Расмус Ларсен
8
colnames(newprice)<- c("premium","change","newprice")
Тунг Нгуен,
Ваша ошибка не имеет ничего общего с качеством вашего кода. Вы просто используете неправильный символ. Это «не распознается R, используйте вместо этого. Я знаю, что они могут выглядеть одинаково. Посмотрите внимательно:« ». Вот и все.
Эдо

Ответы:

595

Используйте colnames()функцию:

R> X <- data.frame(bad=1:3, worse=rnorm(3))
R> X
  bad     worse
1   1 -2.440467
2   2  1.320113
3   3 -0.306639
R> colnames(X) <- c("good", "better")
R> X
  good    better
1    1 -2.440467
2    2  1.320113
3    3 -0.306639

Вы также можете подмножество:

R> colnames(X)[2] <- "superduper"
Дирк Эддельбюттель
источник
12
@Dirk Почему бы не использовать names () вместо colnames ()?
Антуан Лизе
4
Большой! Вы также можете использовать несколько столбцов одновременно (полезно для больших фреймов данных). colnames(X)[c(1,2)] <- c("good", "better")
metakermit
7
Попробуй setnames()в data.tableпакете. Используйте что-то вроде setnames(DT,"b","B")илиsetnames(DT,c("a","E"),c("A","F"))
dwstu
Как ни странно, после установки имен столбцов фрейма данных q1, попытка изменить фрейм данных, используя dplyrкак в q1 <- q1 %>% mutate(rel_count = count / 482462)результате ошибки Error in mutate_impl(.data, dots) : unknown column 'days'(где daysновое имя, присвоенное столбцу). Это действительно расстраивает.
Дэвид Тонхофер
176

Я использую это:

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
Матеус Абреу
источник
7
Спасибо. Я думаю, что это как-то раздражает с R: Почему так трудно изменить имя столбца, если вы не хотите использовать индексный номер, но старое имя :(
Arne
10
Преимущество этого метода заключается в том, что вам не нужно беспокоиться о положении столбца, если вы знаете его оригинальное имя. Я думаю, что это предпочтительный метод, так как вы можете - позже - внести изменения в код, который изменяет положение столбца, который вы хотите переименовать.
Пауло С. Абреу
78

Ошибка вызвана «умными кавычками» (или как они там называются). Урок здесь: «не пишите свой код в« редакторе », который преобразует кавычки в умные».

names(newprice)[1]<-paste(“premium”)  # error
names(newprice)[1]<-paste("premium")  # works

Кроме того, вам не нужно paste("premium")(вызов pasteизбыточен), и это хорошая идея, чтобы поместить пробелы вокруг, <-чтобы избежать путаницы (например x <- -10; if(x<-3) "hi" else "bye"; x).

Джошуа Ульрих
источник
52

Вы пробовали просто:

names(newprice)[1]<-"premium"

?

Джейми
источник
42

Новый рекомендуемый способ сделать это - использовать setNamesфункцию. См ?setNames. Так как при этом создается новая копия data.frame, обязательно назначьте результат оригиналу data.frame, если вы этого хотите .

data_frame <- setNames(data_frame, c("premium","change","newprice"))

Более новые версии R будут предупреждать вас, если вы используете colnamesнекоторые из способов, предложенных в предыдущих ответах.

Если бы это было data.tableвместо, вы могли бы использовать data.tableфункцию setnames, которая может изменять конкретные имена столбцов или имя одного столбца по ссылке :

setnames(data_table, "old-name", "new-name")
Скотт К Уилсон
источник
2
думаю, что это было запрошено для data.frame, а не data.table
Helix123
35

У меня была та же проблема, и этот кусок кода работал для меня.

names(data)[names(data) == "oldVariableName"] <- "newVariableName"

Короче говоря, этот код выполняет следующие действия:

names(data)просматривает все имена в фрейме данных ( data)

[names(data) == oldVariableName]извлекает имя переменной ( oldVariableName), которую вы хотите переименовать, и <- "newVariableName"присваивает имя новой переменной.

Деста Хайлеселасси Хагос
источник
Как бы это работало, если бы у вас был вектор, например, с 3 oldVariableNames?
Jiggunjer
Именно то, что я искал -> 2 больших пальца вверх!
SilSur
19

Подобно другим:

cols <- c("premium","change","newprice")
colnames(dataframe) <- cols

Довольно просто и легко изменить.

Адам Эриксон
источник
10

пытаться:

names(newprice) <- c("premium", "change", "newprice")
ngamita
источник
10

Если вам нужно переименовать не все, а несколько столбцов одновременно, когда вы знаете только старые имена столбцов, вы можете использовать colnamesфункцию и %in%оператор. Пример:

df = data.frame(bad=1:3, worse=rnorm(3), worst=LETTERS[1:3])

   bad      worse    worst
1   1 -0.77915455       A
2   2  0.06717385       B
3   3 -0.02827242       C

Теперь вы хотите изменить «плохой» и «худший» на «хороший» и «лучший». Ты можешь использовать

colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")

Это приводит к

  good      worse  best
1    1 -0.6010363    A
2    2  0.7336155    B
3    3  0.9435469    C
Discipulus
источник
1
Этот код предполагает, что порядок имен ваших столбцов равен порядку вставок
Хиллари Сандерс
10

Используйте это, чтобы изменить имя столбца функцией colname.

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"
Sophanna
источник
8

Вы можете просто сделать редактирование:

newprice <- edit(newprice)

и измените имя столбца вручную.

БАЙКАЛ
источник
Разве это не работает только для векторных и факторных элементов? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
Бродяга
Это работает для фреймов данных по крайней мере. Это то, что я знаю.
Байкал
7

Мои имена столбцов, как показано ниже

colnames(t)
[1] "Class"    "Sex"      "Age"      "Survived" "Freq" 

Я хочу изменить название столбца класса и пола

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
Мехул Катара
источник
7

Есть несколько вариантов с dplyr::rename()и dplyr::select():

library(dplyr)

mtcars %>% 
  tibble::rownames_to_column('car_model') %>%                            # convert rowname to a column. tibble must be installed.
  select(car_model, est_mpg = mpg, horse_power = hp, everything()) %>%   # rename specific columns and reorder
  rename(weight = wt, cylinders = cyl) %>%                               # another option for renaming specific columns that keeps everything by default
  head(2)
      car_model est_mpg horse_power cylinders disp drat weight  qsec vs am gear carb
1     Mazda RX4      21         110         6  160  3.9  2.620 16.46  0  1    4    4
2 Mazda RX4 Wag      21         110         6  160  3.9  2.875 17.02  0  1    4    4

Существует также три варианта области действия dplyr::rename(): dplyr::rename_all()для всех имен столбцов, dplyr::rename_if()для условного таргетинга имен столбцов и dplyr::rename_at()для выбора именованных столбцов. Следующий пример заменяет пробелы и точки подчеркиванием и преобразует все в нижний регистр:

iris %>%  
  rename_all(~gsub("\\s+|\\.", "_", .)) %>% 
  rename_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

dplyr::select_all() также можно использовать аналогичным образом:

iris %>%  
  select_all(~gsub("\\s+|\\.", "_", .)) %>% 
  select_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
sbha
источник
6

Просто чтобы исправить и немного расширить ответ Скотта Уилсона.
Вы также можете использовать setnamesфункцию data.table на data.frames.

Не ожидайте ускорения операции, но вы можете ожидать, что она setnamesбудет более эффективной для потребления памяти, так как она обновляет имена столбцов по ссылке. Это можно отследить с помощью addressфункции, см. Ниже.

library(data.table)
set.seed(123)
n = 1e8

df = data.frame(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(df)
#[1] "0x208f9f00"
colnames(df) <- c("good", "better")
address(df)
#[1] "0x208fa1d8"
rm(df)

dt = data.table(bad=sample(1:3, n, TRUE), worse=rnorm(n))
address(dt)
#[1] "0x535c830"
setnames(dt, c("good", "better"))
address(dt)
#[1] "0x535c830"
rm(dt)

Поэтому, если вы выходите за пределы своей памяти, вы можете вместо этого использовать эту.

jangorecki
источник
3

Это может быть полезно:

rename.columns=function(df,changelist){
  #renames columns of a dataframe
  for(i in 1:length(names(df))){
    if(length(changelist[[names(df)[i]]])>0){
      names(df)[i]= changelist[[names(df)[i]]]
    }
  }
  df
}

# Specify new dataframe
df=rename.columns(df,list(old.column='new.column.name'))
Крис
источник
1

В случае, если у нас есть 2 кадра данных, следующие работы

 DF1<-data.frame('a', 'b')
 DF2<-data.frame('c','d')

Мы меняем имена DF1 следующим образом

 colnames(DF1)<- colnames(DF2)
Raghavan vmvs
источник