Robert Kubrick Robert Kubrick - 2 months ago 8
R Question

How can I rbind vectors matching their column names?

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$row2) = c("B", "A")
l
$row1
A B
10 20

$row2
B A
20 10

rbind(l$row1, l$row2)
A B
[1,] 10 20
[2,] 20 10


How can I produce this matrix from a number of list elements, insuring the column names are correctly matched across rows:

A B
[1,] 10 20
[2,] 10 20

Answer

You can use match:

l <- list(row1 = setNames(1:3, c("A", "B", "C")),
          row2 = setNames(1:3, c("B", "C", "A")),
          row3 = setNames(1:3, c("C", "A", "B")))

do.call(rbind, lapply(l, function(x) x[match(names(l[[1]]), names(x))]))

The result:

     A B C
row1 1 2 3
row2 3 1 2
row3 2 3 1
Comments