1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
##
## Function to do rbind of data frames quickly, even if the columns don't match
##
smartbind <- function(...)
{
verbose <- FALSE
data <- list(...)
if(is.null(names(data)))
names(data) <- as.character(1:length(data))
data <- lapply(data,
function(x)
if(is.matrix(x) || is.data.frame(x))
x
else
data.frame(as.list(x))
)
#retval <- new.env()
retval <- list()
rowLens <- unlist(lapply(data, nrow))
nrows <- sum(rowLens)
rowNameList <- unlist(lapply( names(data),
function(x)
if(rowLens[x]<=1) x
else paste(x, seq(1,rowLens[x]),sep='.'))
)
start <- 1
for(block in data)
{
if(verbose) print(block)
end <- start+nrow(block)-1
for(col in colnames(block))
{
if( !(col %in% names(retval)))
{
if(verbose) cat("Start:", start,
" End:", end,
" Column:", col,
"\n", sep="")
if(class(block[,col])=="factor")
newclass <- "character"
else
newclass <- class(block[,col])
retval[[col]] <- as.vector(rep(NA,nrows), mode=newclass)
}
retval[[col]][start:end] <- as.vector(block[,col],
mode=class(retval[[col]]))
}
start <- end+1
}
#retval <- as.list(retval)
attr(retval,"row.names") <- rowNameList
class(retval) <- "data.frame"
return(retval)
}
|