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

r dataframe

1062910 просмотра

18 ответа

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

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

Автор: Son Источник Размещён: 17.05.2019 03:03

Ответы (18)


512 плюса

Используйте 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"
Автор: Dirk Eddelbuettel Размещён: 21.05.2011 11:45

136 плюса

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

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
Автор: Matheus Abreu Размещён: 17.03.2014 06:00

70 плюса

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

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

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

Автор: Joshua Ulrich Размещён: 21.05.2011 12:40

39 плюса

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

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

?

Автор: Jamie Размещён: 21.05.2011 11:36

33 плюса

Новый рекомендуемый способ сделать это - использовать 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")
Автор: Scott C Wilson Размещён: 19.03.2015 07:21

29 плюса

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

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

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

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

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

Автор: Desta Haileselassie Hagos Размещён: 10.01.2016 07:37

15 плюса

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

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

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

Автор: Adam Erickson Размещён: 31.10.2014 10:52

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 Размещён: 25.01.2016 01:12

8 плюса

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

newprice <- edit(newprice)

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

Автор: Baykal Размещён: 31.01.2013 07:59

7 плюса

пытаться:

names(newprice) <- c("premium", "change", "newprice")
Автор: ngamita Размещён: 01.07.2013 02:52

5 плюса

Просто чтобы исправить и немного расширить ответ Скотта Уилсона.
Вы также можете использовать 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 Размещён: 10.12.2015 01:01

5 плюса

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

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

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

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
Автор: Mehul Katara Размещён: 13.03.2018 09:15

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
}

# Specify new dataframe
df=rename.columns(df,list(old.column='new.column.name'))
Автор: Chris Размещён: 19.05.2016 11:02

1 плюс

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

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

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

 colnames(DF1)<- colnames(DF2)
Автор: Raghavan vmvs Размещён: 03.01.2018 08:11

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
Автор: sbha Размещён: 04.07.2018 11:32

0 плюса

Вы могли бы сразу сделали

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

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

Автор: Aayush Agrawal Размещён: 18.04.2015 07:29

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)

Автор: Seyma Kalay Размещён: 13.01.2019 10:50

0 плюса

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

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"
Автор: Sophanna Размещён: 21.02.2019 08:38
Вопросы из категории :
32x32