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

315

У меня есть кадр данных, называемый "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(), но безрезультатно.

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

  • 0
    Если ответ Дирка сработал, то проблема заключалась в том, что вы работали с матрицей, а не с фреймом данных. Вы можете проверить это с помощью is.matrix или str .
  • 3
    Смотрите этот ответ на dplyr :: переименовать stackoverflow.com/a/26146202/1831980
Показать ещё 1 комментарий
Теги:
dataframe

17 ответов

479

Используйте функцию 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"
  • 10
    @Dirk Почему бы не использовать names () вместо colnames ()?
  • 2
    Большой! Вы также можете использовать несколько столбцов одновременно (полезно для больших фреймов данных). colnames(X)[c(1,2)] <- c("good", "better")
Показать ещё 2 комментария
126

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

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
  • 5
    Спасибо. Я думаю, что это как-то раздражает с R: Почему так трудно изменить имя столбца, если вы не хотите использовать индексный номер, но старое имя :(
  • 20
    вам не нужно, which в этой команде
Показать ещё 1 комментарий
71

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

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

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

  • 3
    Здравствуйте, Джошуа, вы комментируете «умные цитаты» очень верно. большое спасибо.
40

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

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

?

31

Новый рекомендуемый способ сделать это - использовать функцию 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
  • 2
    @ Helix123 решение работает и для data.frame
29

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

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

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

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

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

  • 0
    Как бы это работало, если бы у вас был вектор, например, с 3 oldVariableNames?
15

Аналогично другим:

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

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

9

Если вам нужно переименовать не все, кроме нескольких столбцов, сразу, когда вы знаете только старые имена столбцов, вы можете использовать функцию 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
  • 0
    Этот код предполагает порядок имен столбцов, равный порядку вставок
8

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

newprice <- edit(newprice)

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

  • 0
    Разве это не работает только для векторных и факторных элементов? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
  • 0
    Это работает для фреймов данных по крайней мере. Это то, что я знаю.
Показать ещё 1 комментарий
7

попробовать:

names(newprice) <- c("premium", "change", "newprice")
5

Просто чтобы исправить и слегка расширить ответ Скотта Уилсона.
Вы также можете использовать функцию data.table setnames для 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

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

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

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

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
2

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

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
}

DF = rename.columns(DF, список (old.column = 'new.column.name'))

2

Вы могли бы прямо сделать

names(newprice) <- c("premium","change","newprice")

Используемая вами команда paste принимает по два аргумента. Он работает как функция concatenate в excel, поэтому он дает вам ошибку, я думаю.

  • 8
    Чем этот ответ отличается от поста ngamita?
  • 0
    Сожалею. Я хотел выделить причину, по которой команда вставки выдает ему ошибку.
1

Есть несколько вариантов с 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
1

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

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

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

 colnames(DF1)<- colnames(DF2)
0

Получение данных с выбранными столбцами

get.the.df <- read_excel("df.xls") %>%    
          select("X1","X2","X3");names(get.the.df)

изменить имя столбцов get.the.df colnames(get.the.df) <- c("X22","X11","X33");names(get.the.df)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню