tags:

views:

75

answers:

3

I have a question about the colnames() function in the base package

Let's say you have a data.frame, as follows:

df <- data.frame(variable=letters[1:100], value=rnorm(100))

As one would expect, colnames(df[1]) returns:

colnames(df[1]) 

[1] "variable"

However, it doesn't seem that assignment is possible when calling a specific column

colnames(df[1]) <- c("test")
colnames(df[1])

[1] "variable"

Why is that?

+6  A: 

Because you should be doing this:

> colnames(df)[1] <- "test"
> colnames(df)[1]
[1] "test"

The colnames function returns a character vector that can be altered.

Shane
+2  A: 

Call the colnames() function on the dataframe (the entire dataframe) then access by indexing, the items of the 1D vector returned by that function call:

> data(Orange)    
> Orange[1:5,]
  Tree  age circumference
1    1  118            30
2    1  484            58
3    1  664            87
4    1 1004           115
5    1 1231           120
> call *colnames* on the Orange dataframe and bind it to the variable *cn*
> cn = colnames(Orange)
> cn    
[1] "Tree"          "age"           "circumference"
> length(cn)
[1] 3
> class(cn)
 [1] "character"

> # access the items of this 1D character vector by index:
> cn[1]
[1] "Tree"
> cn[3]
[1] "circumference"
> # likewise modify any item the same way:
> cn[3] = '2*pi*r'
doug
+2  A: 

The reason your version does not do what you expect is that df[1] creates a temporary data frame in memory, the colnames function then changes the name of the 1 column in this temporary data frame (not your original data frame), but then nothing else is done with the temporary df so it is silently discarded. Your original data frame was never touched, so the next time you do colnames(df[1]) a new temporary df is created copying from your unmodified original and the colname is returned.

Changing the order of calling callnames and subsetting does what you want as the other answers show.

Greg Snow
Thanks! That's the "why"!
Brandon Bertelsen