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
答案 0 :(得分:21)
smartbind()
将匹配列名并容忍丢失的名称:
library(gtools)
do.call(smartbind,l)
A B
row1 10 20
row2 10 20
答案 1 :(得分:13)
似乎在当前版本的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
答案 2 :(得分:12)
rbind
将起作用:
do.call("rbind", lapply(l, function(x) data.frame(as.list(x))))
A B
row1 10 20
row2 10 20
答案 3 :(得分:11)
您可以使用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
答案 4 :(得分:7)
do.call(rbind, lapply(l, function(row) row[order(names(row))]))
答案 5 :(得分:0)
为什么不只是rbind(l$row1, l$row2[names(l$row1)])
。也适用于数据帧。请注意,这会丢弃l$row2
中不会显示在l$row1
中的列。
答案 6 :(得分:0)
Reduce是一个强大的功能,但是有些却不经常使用;这是替代实现
这将创建一个rbind,如果有不匹配的列将为它们生成。
function working