Изменение имен столбцов фрейма данных - PullRequest
349 голосов
/ 21 мая 2011

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

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

Ответы [ 16 ]

6 голосов
/ 10 декабря 2015

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

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

5 голосов
/ 13 марта 2018

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

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

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

colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
4 голосов
/ 04 июля 2018

Существует пара опций с 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
2 голосов
/ 21 февраля 2019

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

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"
2 голосов
/ 20 мая 2016

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

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 голос
/ 03 января 2018

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

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

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

 colnames(DF1)<- colnames(DF2)
...