Data frame is given by the rest of the script and not really an option. Other than that, you are absolutely right.
Ralf On Tue, Aug 3, 2010 at 11:34 PM, Dennis Murphy <djmu...@gmail.com> wrote: > 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.bie...@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 <dwinsem...@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. > > ______________________________________________ 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.