2013-06-06 5 views
19

rbindは、列名をチェックしません:列名に一致するベクターをどのようにして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 

答えて

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 
+1

下記の@ scs76の回答を参照してください。このソリューションはもはや必要ありません。 – Ashe

+1

'行'の要素数が異なる場合、これはまだ必要です。 – js86

7
do.call(rbind, lapply(l, function(row) row[order(names(row))])) 
11

rbindあなたが最初のデータフレームにLの各要素を変更した場合に動作します:

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

     A B 
row1 10 20 
row2 10 20 
+0

シュート。 Matthew Plourdeが私をパンチに倒した。 – SchaunW

+0

+1それはあなたのものです。 –

+2

+1!ここで興味深いのは、 'data.table'の古典的な同等の' rbindlist'は 'do.call(rbind、...) 'と同じ答えを与えないということです。 – agstudy

20

smartbind()は、列名と一致し、欠けているものを許容します:

library(gtools) 
do.call(smartbind,l) 
     A B 
row1 10 20 
row2 10 20 
+4

'plyr :: rbind.fill'も同様の解決策です。 –

11

それはそうです現在のバージョンのR(バージョン3.3.0)では、rbindは、同じ名前の列を持つ2つのデータセットを結合する能力を持っていますねえ、別の順序です。

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

なぜrbind(l$row1, l$row2[names(l$row1)])ではないのでしょうか。また、データフレームにも適しています。これにより、l$row2の列は、l$row1には表示されません。

関連する問題