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


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



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

Если вам нужно переименовать не все, а несколько столбцов одновременно, когда вы знаете только старые имена столбцов, вы можете использовать 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

1
Этот код предполагает, что порядок имен ваших столбцов равен порядку вставок
Хиллари Сандерс

10

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

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"

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

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)

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


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