it-swarm.com.de

Wie kann ich Vektoren abgleichen, die mit ihren Spaltennamen übereinstimmen?

rbind prüft beim Binden von Vektoren nicht auf Spaltennamen:

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 Reihe von Listenelementen erstellen, um sicherzustellen, dass die Spaltennamen in den Zeilen richtig abgeglichen werden:

      A  B
[1,] 10 20
[2,] 10 20
24
Robert Kubrick

Sie können match verwenden:

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
11
Sven Hohenstein

smartbind() stimmt mit den Spaltennamen überein und toleriert fehlende Namen:

library(gtools)
do.call(smartbind,l)
      A  B
row1 10 20
row2 10 20
21
Ari B. Friedman

Es scheint, dass rbind in aktuellen Versionen von R (ich habe Version 3.3.0) die Fähigkeit hat, zwei Datensätze mit den gleichen Namensspalten zu verknüpfen, selbst wenn sie in unterschiedlicher Reihenfolge sind.

   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
13
scs76

rbind funktioniert, wenn Sie zuerst jedes Element von l in einen Datenrahmen ändern:

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

      A  B
row1 10 20
row2 10 20
11
SchaunW
do.call(rbind, lapply(l, function(row) row[order(names(row))]))
7
Matthew Plourde

Reduzieren ist eine mächtige Funktion, aber einige werden nicht häufig verwendet. Hier ist eine alternative Implementierung 

Dadurch wird eine Verknüpfung erstellt, in der Spalten generiert werden, die nicht mit "NA" übereinstimmen.

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)
}
}
0
Yash

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

0
David Roberts