rbind two data.frame preserving row order and row names

前端 未结 2 476
孤街浪徒
孤街浪徒 2021-02-08 15:14

I have a list of data.frame objects which i would like to row append to one another, ie merge(..., all=T). However, merge seems to remove

相关标签:
2条回答
  • 2021-02-08 15:23

    Since you know you are not actually merging, but just rbind-ing, maybe something like this will work. It makes use of rbind.fill from "plyr". To use it, specify a list of the data.frames you want to rbind.

    RBIND <- function(datalist) {
      require(plyr)
      temp <- rbind.fill(datalist)
      rownames(temp) <- unlist(lapply(datalist, row.names))
      temp
    }
    RBIND(list(x, y))
    #               a  b  c  d
    # row_1         1  2  3  4
    # another_row1  2  3  4  5
    # row_2        10 20 30 NA
    # another_row2 20 30 40 NA
    
    0 讨论(0)
  • 2021-02-08 15:36

    One way is to use row.names in merge so that you get it as an additional column.

    > merge(x, y, by=c("row.names", "a","b","c"), all.x=T, all.y=T, sort=F)
    
    #      Row.names  a  b  c  d
    # 1        row_1  1  2  3  4
    # 2 another_row1  2  3  4  5
    # 3        row_2 10 20 30 NA
    # 4 another_row2 20 30 40 NA
    

    Edit: By looking at the merge function with getS3method('merge', 'data.frame'), the row.names are clearly set to NULL (it is a pretty long code, so I won't paste here).

    # Commenting 
    # Lines 63 and 64
    row.names(x) <- NULL
    row.names(y) <- NULL
    
    # and 
    # Line 141 (thanks Ananda for pointing out)
    attr(res, "row.names") <- .set_row_names(nrow(res))
    

    and creating a new function, say, MERGE, works as the OP intends for this example. Just an experimentation.

    0 讨论(0)
提交回复
热议问题