Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rename one named column in R

Tags:

dataframe

r

I want to update one column of a dataframe, referencing it using its original name, is this possible? For example say I had the table 'data'

a b c  
1 2 2  
3 2 3  
4 1 2

and I wanted to update the name of column b to 'd'. I know I could use

colnames(data)[2] <- 'd'  

but can I make the change by specifically referencing b, i.e. something like

colnames(data)['b'] <- 'd'  

so that if the column ordering of the dataframe changes the correct column name will still be updated.

Thanks in advance

like image 531
user1165199 Avatar asked May 18 '12 15:05

user1165199


People also ask

How do I rename a specific column in R?

Method 1: using colnames() method colnames() method in R is used to rename and replace the column names of the data frame in R. The columns of the data frame can be renamed by specifying the new column names as a vector. The new name replaces the corresponding old name of the column in the data frame.

How do you rename a column name?

To change a column name, enter the following statement in your MySQL shell: ALTER TABLE table_name RENAME COLUMN old_column_name TO new_column_name; Replace table_name , old_column_name , and new_column_name with your table and column names.

How do I rename a column by index in R?

How to rename column by index in the R data frame? R provides base function colnames() and names() function to change column name by index position. Besides these, use dplyr rename() , select() and rename_with() to rename/change a DataFrame (data. frame) column.

How do I rename two columns in R?

The easiest way to rename columns in R is by using the setnames() function from the “data. table” package. This function modifies the column names given a set of old names and a set of new names. Alternatively, you can also use the colnames() function or the “dplyr” package.


1 Answers

There is a function setnames built into package data.table for exactly that.

setnames(DT, "b", "d")

It changes the names by reference with no copy at all. Any other method using names(data)<- or names(data)[i]<- or similar will copy the entire object, usually several times. Even though all you're doing is changing a column name.

DT must be type data.table for setnames to work, though. So you'd need to switch to data.table or convert using as.data.table, to use it.

Here is the extract from ?setnames. The intention is that you run example(setnames) at the prompt and then the comments relate to the copies you see being reported by tracemem.

DF = data.frame(a=1:2,b=3:4)       # base data.frame to demo copies
tracemem(DF)
colnames(DF)[1] <- "A"             # 4 copies of entire object
names(DF)[1] <- "A"                # 3 copies of entire object
names(DF) <- c("A", "b")           # 2 copies of entire object
`names<-`(DF,c("A","b"))           # 1 copy of entire object
x=`names<-`(DF,c("A","b"))         # still 1 copy (so not print method)

# What if DF is large, say 10GB in RAM. Copy 10GB just to change a column name?

DT = data.table(a=1:2,b=3:4,c=5:6)
tracemem(DT)
setnames(DT,"b","B")               # by name; no match() needed. No copy.
setnames(DT,3,"C")                 # by position. No copy.
setnames(DT,2:3,c("D","E"))        # multiple. No copy.
setnames(DT,c("a","E"),c("A","F")) # multiple by name. No copy.
setnames(DT,c("X","Y","Z"))        # replace all. No copy.
like image 142
Matt Dowle Avatar answered Oct 13 '22 14:10

Matt Dowle