Wouldn't a list be a better object type if the variables you want to add
have variable lengths? This way you don't have to worry about nuisances such
as NA padding. Just a thought...

Dennis

On Tue, Aug 3, 2010 at 7:54 PM, Ralf B <ralf.bierig@gmail.com> wrote:

> Actually it does -- one has to use feed the result back into the
> original variable:
>
> 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)
> }
>
> mydata <- NULL
> mydata <- data.frame(userid = c(5, 6, 5, 6, 5, 6), taskid = c(1, 1, 2, 2,
> 3, 3),
>      stuff = 11:16)
> mydata  <- add.col(mydata, c(1,2,3,4),"test1")
> mydata  <- add.col(mydata, c(1,2,3,4,5,6,7,8),"test2")
> mydata
>
>
> Thanks a lot, David and all others here you made the effort!
> Ralf
>
>
> On Tue, Aug 3, 2010 at 10:37 PM, David Winsemius <dwinsemius@comcast.net>
> wrote:
> >
> > On Aug 3, 2010, at 10:35 PM, David Winsemius wrote:
> >
> >>
> >> 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
> >>
> > Actually it doesn't name column correctky...  see below for a method with
> "[
> > <-" .
> >
> >>> 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 Winsemius, MD
> > West Hartford, CT
> >
> >
>
> ______________________________________________
> R-help@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

	[[alternative HTML version deleted]]

