У меня есть кадр данных, называемый "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()
, но безрезультатно.
Может ли кто-нибудь помочь мне разобраться с этим?
Используйте функцию 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"
colnames(X)[c(1,2)] <- c("good", "better")
Я использую это:
colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
which
в этой команде
Ошибка вызвана "умными кавычками" (или тем, что они вызывают). Урок здесь: "Не записывайте свой код в" редактор ", который преобразует цитаты в смарт-кавычки".
names(newprice)[1]<-paste("premium") # error
names(newprice)[1]<-paste("premium") # works
Кроме того, вам не нужен paste("premium")
(вызов paste
является избыточным), и рекомендуется помещать пробелы вокруг <-
, чтобы избежать путаницы (например, x <- -10; if(x<-3) "hi" else "bye"; x
).
Вы пробовали просто:
names(newprice)[1]<-"premium"
?
Новый рекомендуемый способ сделать это - использовать функцию 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")
У меня была такая же проблема, и этот фрагмент кода работал у меня.
names(data)[names(data) == "oldVariableName"] <- "newVariableName"
Короче говоря, этот код выполняет следующие действия:
names(data)
просматривает все имена в фрейме данных (data
)
[names(data) == oldVariableName]
извлекает имя переменной (oldVariableName
), которую вы хотите переименовать, и <- "newVariableName"
назначает новое имя переменной.
Аналогично другим:
cols <- c("premium","change","newprice")
colnames(dataframe) <- cols
Достаточно просто и легко изменить.
Если вам нужно переименовать не все, кроме нескольких столбцов, сразу, когда вы знаете только старые имена столбцов, вы можете использовать функцию 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
Вы можете просто выполнить редактирование:
newprice <- edit(newprice)
и измените имя столбца вручную.
> locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
попробовать:
names(newprice) <- c("premium", "change", "newprice")
Просто чтобы исправить и слегка расширить ответ Скотта Уилсона.
Вы также можете использовать функцию 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)
Итак, если вы нажмете на свои пределы памяти, вы можете использовать этот вариант вместо этого.
Мои имена столбцов, как показано ниже
colnames(t)
[1] "Class" "Sex" "Age" "Survived" "Freq"
Я хочу изменить имя столбца класса и пола
colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
Это может быть полезно:
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
}
DF = rename.columns(DF, список (old.column = 'new.column.name'))
Вы могли бы прямо сделать
names(newprice) <- c("premium","change","newprice")
Используемая вами команда paste принимает по два аргумента. Он работает как функция concatenate в excel, поэтому он дает вам ошибку, я думаю.
Есть несколько вариантов с 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 кадра данных, следующие работы
DF1<-data.frame('a', 'b')
DF2<-data.frame('c','d')
Мы меняем имена DF1 следующим образом
colnames(DF1)<- colnames(DF2)
Получение данных с выбранными столбцами
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)
is.matrix
илиstr
.