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. > [[alternative HTML version deleted]] ______________________________________________ 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.