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

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

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

Ответ 1

Используйте функцию 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"

Ответ 2

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

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"

Ответ 3

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

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

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

Ответ 4

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

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

?

Ответ 5

Новый рекомендуемый способ сделать это - использовать функцию 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")

Ответ 6

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

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

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

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

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

newprice <- edit(newprice)

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

Ответ 11

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

Итак, если вы нажмете на свои пределы памяти, вы можете использовать этот вариант вместо этого.

Ответ 12

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

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

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

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

Ответ 13

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

Ответ 14

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

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

Ответ 15

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

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

Ответ 16

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

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

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

 colnames(DF1)<- colnames(DF2)

Ответ 17

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

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

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

Ответ 18

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

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)