У меня есть рамка данных под названием "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(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
Ошибка вызвана "умными кавычками" (или как они там называются). Урок заключается в следующем: "не пишите свой код в 'редакторе', который преобразует кавычки в "умные кавычки".
names(newprice)[1]<-paste(“premium”) # error
names(newprice)[1]<-paste("premium") # works
Также, вам'не нужно paste("premium")
(вызов paste
является избыточным) и'хорошая идея ставить пробелы вокруг <-
, чтобы избежать путаницы (например, x <- -10; if(x<-3) "hi" else "bye"; x
).
Новый рекомендуемый способ сделать это-использовать функцию setNames
. См
?setNames
. Так как это создает новую копию данных.рама, обязательно присвоить результат исходные данные
.рама`, если это ваше намерение.
data_frame <- setNames(data_frame, c("premium","change","newprice"))
Новые версии Р даст вам предупреждение, если вы используете colnames
в некоторые из способов, предложенных ранее ответов.
Если бы это было данных.стол вместо этого можно использовать данные.таблицыфункции
setnames, который может изменить определенные имена столбцов или один столбец имя by reference:
setnames(data_table, "old-name", "new-name")
У меня был тот же вопрос, и этот кусок кода работал для меня.
names(data)[names(data) == "oldVariableName"] <- "newVariableName"
Короче говоря, этот код делает следующее:
имена(данные)` выглядит на все имена в таблицы данных ("данные")
[имена(данные) == oldVariableName]
извлекает имя переменной (oldVariableName
) вы хотите получить и переименован в < - то "newVariableName"
в присваивает новое имя переменной.
Похож на другие:
cols <- c("premium","change","newprice")
colnames(dataframe) <- cols
Очень просто и легко изменить.
Если вам нужно переименовать не все, но несколько столбцов сразу, когда вы знаете только старые имена столбцов, вы можете использовать функцию colnames
и в %
оператор. Пример:
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
Мои имена столбцов, как показано ниже
colnames(t)
[1] "Class" "Sex" "Age" "Survived" "Freq"
Я хочу изменить имя столбца класса и пола
colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
Просто правильно и немного продлить Скотт ответил Уилсон. Вы можете использовать данные.таблица'функция S `setnames на данные.кадров тоже.
Не ожидайте ускорения работы, но вы можете ожидать setnames
, чтобы быть более эффективным на потребление памяти, как он обновляет имена столбцов по ссылке. Это может быть отслежены с "адрес" функции, см. ниже.
в <!-- язык: Р --!>
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)
Так что если вы убираете вашу память ограничивает, вы можете рассмотреть, чтобы использовать это вместо этого.
Есть несколько вариантов с dplyr::переименовать()и
dplyr::выбрать()`:
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::переименовать()
: 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
Это может быть полезно:
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'))
В случае если у нас есть 2 таблицы данных следующие работы
DF1<-data.frame('a', 'b')
DF2<-data.frame('c','d')
Мы меняем имена DF1 следующим образом
colnames(DF1)<- colnames(DF2)