Зміна назв стовпців кадру даних


399

У мене є кадр даних під назвою "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
Rasmus Larsen

8
colnames(newprice)<- c("premium","change","newprice")
Тунг Нгуен

Ваша помилка не має нічого спільного з якістю вашого коду. Ви просто використовуєте неправильний символ. Це "не розпізнається R, використовуйте" замість цього. Я знаю, що вони можуть виглядати однаково. Погляньте близько: "". Це воно.
Едо

Відповіді:


594

Використовуйте 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 Чому б не використовувати імена () замість імен ()?
Антуан Лізе

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: Чому так важко змінити назву стовпця, якщо ви не хочете використовувати індексний номер, а стару назву :(
Арне,

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 старими VariableNames?
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

Просто для виправлення та трохи розширення відповіді Скотта Вілсона.
Функцію 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

Це може бути корисно:

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.