2013-06-06 5 views
19

rbind prüft nicht für Spaltennamen, wenn die Bindung zusammen Vektoren:Wie kann ich Vektoren verknüpfen, die ihren Spaltennamen entsprechen?

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 

Wie kann ich diese Matrix aus einer Anzahl von Listenelementen erzeugen, werden die Spaltennamen sichergestellt korrekt abgestimmt über die Reihen:

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

Antwort

11

können Sie verwenden 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))])) 

Das Ergebnis:

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

Siehe die Antwort von @ scs76 unten; Diese Lösung wird nicht mehr benötigt. – Ashe

+1

Dies wird immer noch benötigt, wenn die 'Zeilen' unterschiedliche Anzahlen von Elementen haben. – js86

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

rbind wird funktionieren, wenn Sie zum ersten Mal, jedes Element von l zu einem Datenrahmen ändern:

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

     A B 
row1 10 20 
row2 10 20 
+0

Schießen. Matthew Plourde hat mich geschlagen. – SchaunW

+0

+1 alles ist dein. –

+2

+1! Beachten Sie auch, dass es hier interessant ist, dass das klassische Äquivalent 'rbindlist' aus' data.table' nicht die gleiche Antwort gibt wie 'do.call (rbind, ...)' – agstudy

20

smartbind() wird und duldet fehlende Angaben überein Namen Spalte:

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

'plyr :: rbind.fill' ist eine ähnliche Lösung. –

11

Es scheint, dass in aktuellen Versionen von R (ich habe Version 3.3.0) rbind die Fähigkeit hat, zwei Datensätze mit denselben Namenspalten zu verbinden, selbst wenn t Hey, sind in anderer Reihenfolge.

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

Warum nicht einfach rbind(l$row1, l$row2[names(l$row1)]). Funktioniert auch gut für Datenrahmen. Beachten Sie, dass dadurch Spalten von l$row2, die nicht in l$row1 erscheinen, verworfen werden.

Verwandte Themen