32

rbind 在将向量绑定在一起时不检查列名:

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

如何从多个列表元素中生成此矩阵,以确保列名跨行正确匹配:

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

7 回答 7

26

似乎在 R 的当前版本(我有 3.3.0 版)中,rbind即使它们的顺序不同,也有能力连接两个具有相同名称列的数据集。

   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
于 2016-09-07T00:48:21.317 回答
21

smartbind()将匹配列名并容忍缺失的列名:

library(gtools)
do.call(smartbind,l)
      A  B
row1 10 20
row2 10 20
于 2013-06-06T13:47:39.767 回答
14

您可以使用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))]))

结果:

     A B C
row1 1 2 3
row2 3 1 2
row3 2 3 1
于 2013-06-06T13:00:47.533 回答
12

rbind如果您首先将 l 的每个元素更改为数据框,则将起作用:

do.call("rbind", lapply(l, function(x) data.frame(as.list(x))))

      A  B
row1 10 20
row2 10 20
于 2013-06-06T13:06:49.277 回答
7
do.call(rbind, lapply(l, function(row) row[order(names(row))]))
于 2013-06-06T13:01:52.457 回答
1

为什么不只是rbind(l$row1, l$row2[names(l$row1)])。也适用于数据帧。请注意,这将丢弃l$row2未出现在l$row1.

于 2017-03-21T21:39:32.837 回答
0

reduce是一个强大的功能,但有些不常用;这是一个替代实现

这将创建一个 rbind,如果存在与“NA”不匹配的列,将为它们生成。

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)
}
}
于 2018-07-11T17:32:14.770 回答