How can I rbind vectors matching their column names?

后端 未结 7 1988
醉话见心
醉话见心 2020-12-01 16:04

rbind does not check for column names when binding together vectors:

l = list(row1 = c(10, 20), row2 = c(20, 10))
names(l$row1) = c(\"A\", \"B\")
names(l$row         


        
相关标签:
7条回答
  • 2020-12-01 16:20

    smartbind() will match column names and tolerates missing ones:

    library(gtools)
    do.call(smartbind,l)
          A  B
    row1 10 20
    row2 10 20
    
    0 讨论(0)
  • 2020-12-01 16:24

    rbind will work if you first change each element of l to a data frame:

    do.call("rbind", lapply(l, function(x) data.frame(as.list(x))))
    
          A  B
    row1 10 20
    row2 10 20
    
    0 讨论(0)
  • 2020-12-01 16:35
    do.call(rbind, lapply(l, function(row) row[order(names(row))]))
    
    0 讨论(0)
  • 2020-12-01 16:37

    Reduce is a powerful function, but some how not frequently used ; here's an alternate implementation

    This will create a rbind where if there are columns that don't match "NA" will be generated for them.

    rbindedFrame = Reduce(custom_rbind,listofDataframes)  
    
    custom_rbind = function(x1,x2){
      c1 = setdiff(colnames(x1),colnames(x2))
      c2 = setdiff(colnames(x2),colnames(x1))
      for(c in c2){##Adding missing columns from 2 in 1
        x1[[c]]=NA
      }
      for(c in c1){##Similiarly ading missing from 1 in 2
        x2[[c]]=NA
      }
      x2 = x2[colnames(x1)]
      rbind(x1,x2)
    }
    }
    
    0 讨论(0)
  • 2020-12-01 16:40

    It seems that in current versions of R (I have version 3.3.0), rbind has the capacity to to join two data sets with the same name columns even if they are in different order.

       df1 <- data.frame(a = c(1:5), c = c(LETTERS[1:5]),b=c(11:15))
       df2 <- data.frame(a = c(6:10), b = c(16:20),c=c(LETTERS[6:10]))
       rbind(df1,df2)
        a c  b
    1   1 A 11
    2   2 B 12
    3   3 C 13
    4   4 D 14
    5   5 E 15
    6   6 F 16
    7   7 G 17
    8   8 H 18
    9   9 I 19
    10 10 J 20
    
    0 讨论(0)
  • 2020-12-01 16:41

    Why not just rbind(l$row1, l$row2[names(l$row1)]). Also works well for data frames. Note that this will discard columns from l$row2 that don't appear in l$row1.

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