[R] Adding collumn to existing data frame

David Winsemius dwinsemius at comcast.net
Wed Aug 4 04:35:27 CEST 2010


On Aug 3, 2010, at 8:32 PM, Ralf B wrote:

> Hi experts,
>
> I am trying to write a very flexible method that allows me to add a
> new column to an existing data frame. This is what I have so far:
>
> add.column <- function(df, new.col, name) {
> 	n.row <- dim(df)[1]
> 	length(new.col) <- n.row
> 	names(new.col) <- name
> 	return(cbind(df, new.col))
> }
>
> df <- NULL
> df <- data.frame(a=c(1,2,3))
> df
> # corect: added NA to new collumn
> df <- add.column(df,c(1,2),'myNewColumn2')
> df
> # problem: not added, data frame should be extended with NAs
> add.column(df,c(1,2,3,4),'myNewColumn3')
> df
>
>
> However, there are two problems:
>
> 1) The column name is not renamed accurately but always set to
> 'new.col' . Surely this could be done outside the function, but it
> would be better if its self contained.

Try this:

add.col <- function(df, vec, namevec){
                           length(vec) <- nrow(df) # pads with NA's
                           cbind(df, namevec=vec)} # names new col  
properly

> 2) It does not work for cases where new.col is longer than the length
> of the data frame. In such cases, I would like to add NA's to the data
> frame if it has less rows.

Don't have a compact answer to this. (Tried re-dimensioning with  
"dim() <-"  but it was not accepted by the interpreter.  Would need to  
add a test at the beginning and then pad with rows of NA's using rbind  
before cbinding as above.

add.col <- function(df, vec, namevec){
                if (nrow(df) < length(vec) ){ df <-  # pads rows if  
needed
                      rbind(df, matrix(NA, length(vec)-nrow(df),  
ncol(df),
                                       dimnames=list( NULL,  
names(df) ) ) ) }
                length(vec) <- nrow(df) # pads with NA's
                df[, namevec] <- vec; # names new col properly
	return(df)}

>
> Any ideas to to solve this?

Has not been tested with columns of varying types.

-- 
David.
West Hartford, CT



More information about the R-help mailing list