File: smartbind.R

package info (click to toggle)
gtools 2.6.2-1
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 328 kB
  • ctags: 5
  • sloc: asm: 127; ansic: 69; makefile: 1
file content (64 lines) | stat: -rw-r--r-- 1,849 bytes parent folder | download | duplicates (3)
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)
  }