I have a data frame called "newprice" (see below) and I want to change the column names in my program in R.
> newprice
Chang. Chang. Chang.
1 100 36 136
2 120 -33 87
3 150 14 164
In fact this is what am doing:
names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice")
I have not put this in a loop because I want each column name to be different as you see.
When I paste my program into R console this is the output it gives me:
> 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(“"
I have equally tried using the c()
function-for example c("premium")
, instead of the paste()
function, but to no avail.
Could someone help me to figure this out?
is.matrix
or str
.
colnames(newprice)<- c("premium","change","newprice")
2
in colnames(X)[2]
. This is usually a not good practice because it is sensitive to data change. What if you add another column before this specific column to your data? Instead, try something like the answer provided by Hagos.
Use the colnames()
function:
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
You can also subset:
R> colnames(X)[2] <- "superduper"
I use this:
colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
data.table::setnames(dataframe,'Old','New')
The error is caused by the "smart-quotes" (or whatever they're called). The lesson here is, "don't write your code in an 'editor' that converts quotes to smart-quotes".
names(newprice)[1]<-paste(“premium”) # error
names(newprice)[1]<-paste("premium") # works
Also, you don't need paste("premium")
(the call to paste
is redundant) and it's a good idea to put spaces around <-
to avoid confusion (e.g. x <- -10; if(x<-3) "hi" else "bye"; x
).
Try:
names(newprice)[1] <- "premium"
The new recommended way to do this is to use the setNames
function. See ?setNames
. Since this creates a new copy of the data.frame
, be sure to assign the result to the original data.frame
, if that is your intention.
data_frame <- setNames(data_frame, c("premium","change","newprice"))
Newer versions of R will give you warning if you use colnames
in some of the ways suggested by earlier answers.
If this were a data.table
instead, you could use the data.table
function setnames
, which can modify specific column names or a single column name by reference:
setnames(data_table, "old-name", "new-name")
I had the same issue and this piece of code worked out for me.
names(data)[names(data) == "oldVariableName"] <- "newVariableName"
In short, this code does the following:
names(data)
looks into all the names in the dataframe (data
)
[names(data) == oldVariableName]
extracts the variable name (oldVariableName
) you want to get renamed and <- "newVariableName"
assigns the new variable name.
Similar to the others:
cols <- c("premium","change","newprice")
colnames(dataframe) <- cols
Quite simple and easy to modify.
Use this to change column name by colname function.
colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"
If you need to rename not all but multiple column at once when you only know the old column names you can use colnames
function and %in%
operator. Example:
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
Now you want to change "bad" and "worst" to "good" and "best". You can use
colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")
This results in
good worse best
1 1 -0.6010363 A
2 2 0.7336155 B
3 3 0.9435469 C
There are a couple options with dplyr::rename()
and 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
There are also three scoped variants of dplyr::rename()
: dplyr::rename_all()
for all column names, dplyr::rename_if()
for conditionally targeting column names, and dplyr::rename_at()
for select named columns. The following example replaces spaces and periods with an underscore and converts everything to lower case:
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()
can also be used in a similar way:
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
My column names is as below
colnames(t)
[1] "Class" "Sex" "Age" "Survived" "Freq"
I want to change column name of Class and Sex
colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
try:
names(newprice) <- c("premium", "change", "newprice")
Just to correct and slightly extend Scott Wilson answer.
You can use data.table's setnames
function on data.frames too.
Do not expect speed up of the operation but you can expect the setnames
to be more efficient for memory consumption as it updates column names by reference. This can be tracked with address
function, see below.
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)
So if you are hitting your memory limits you may consider to use this one instead.
You can just do the editing by:
newprice <- edit(newprice)
and change the column name manually.
> locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
This may be helpful:
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'))
In case we have 2 dataframes the following works
DF1<-data.frame('a', 'b')
DF2<-data.frame('c','d')
We change names of DF1 as follows
colnames(DF1)<- colnames(DF2)
One option using data.table
:
library(data.table)
setDT(dataframe)
setnames(dataframe,'Old1','New1')
setnames(dataframe,'Old2','New2')
Change data frame column name
colnames(dataset)[colnames(dataset) == 'name'] <- 'newcolumnname'
Success story sharing
colnames(X)[c(1,2)] <- c("good", "better")
setnames()
in thedata.table
package. Use something likesetnames(DT,"b","B")
orsetnames(DT,c("a","E"),c("A","F"))
q1
, trying to mutate the data frame usingdplyr
as inq1 <- q1 %>% mutate(rel_count = count / 482462)
results in the errorError in mutate_impl(.data, dots) : unknown column 'days'
(wheredays
is a new name given to the column). This is really frustrating.