Изменение имен столбцов фрейма данных - 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 ]

546 голосов
/ 21 мая 2011

Используйте функцию 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"
155 голосов
/ 17 марта 2014

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

colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
74 голосов
/ 21 мая 2011

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

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 голосов
/ 21 мая 2011

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

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

?

36 голосов
/ 19 марта 2015

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

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

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

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

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

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

16 голосов
/ 01 ноября 2014

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

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

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

10 голосов
/ 25 января 2016

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

попробуй:

names(newprice) <- c("premium", "change", "newprice")
7 голосов
/ 31 января 2013

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

newprice <- edit(newprice)

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

...