2016-04-09 8 views
-1

Ich erstelle ein Klassifikationsmodell für Prognosezwecke. Ich habe mehrere ext-Dateien, die ich in eine große Liste mit mehreren Listen (Kamm genannt) umgewandelt habe. Ich habe dann die große Liste in einen separaten Datenrahmen mit jeder Liste als eigene Spalte (genannt BI) gebrochen. Da jede Liste eine unterschiedliche Anzahl von Elementen enthalten kann, funktioniert die einfachere Argumentmatrix (unlist (l), ncol = ncol) nicht. Wenn Alternativen bewerten, machte ich Modifikation folgendes zu kompilieren:Hinzufügen von Null zu einer Spalte in den ersten x Zeilen in R

max_length <- max(sapply(comb,length)) 

BI<-sapply(comb, function(x){ 
c(x, rep(0, max_length - length(x))) 
}) 

Dies schafft eine Datenrahmen zuweisen jeder Liste eine Spalte und Zuordnen jedes fehlende Element in dieser Spalte einen Wert von Null. Diese Nullen erscheinen am Ende dieser Spalte, aber ich möchte, dass sie am Anfang der Spalte stehen. Hier ist ein Beispiel für Stromausgang:

cola colb colc 
2 2 2 
1 1 0 
4 0 0 

Ich brauche deine Hilfe meiner ursprünglichen Code bei der Umwandlung in folgendem Format zu produzieren:

acola colb colc 
2 0 0 
1 2 0 
4 1 2 
+0

Wo ist die ursprüngliche Liste 'Kamm'? Das scheint irgendwie wichtig –

+0

was Sie wollen, ist nur Nullen, wenn überhaupt, "an der Spitze" jeder Spalte? Könntest du mit "dput" einige deiner Listen posten? –

+0

@VincentBonhomme & Hadd E. Nuff die Ausgabe ist eine große Ausgabe, aber im Wesentlichen Kamm ist eine Liste von 15 Listen (alle numerischen, unterschiedliche Anzahl von Elementen, mit Zahlen von 0 bis 18000). – sfyn

Antwort

0

Es könnte sein, ausreichend zu vertauschen die Reihenfolge, in der Verkettung c:

max_length <- max(sapply(comb, length)) 

BI <- sapply(comb, function(x){ 
    c(rep(0, max_length - length(x)), x) 
}) 

EDIT: Basierend auf zusätzliche Informationen in den Kommentaren Unten finden Sie einen Ansatz, der den Code auf andere Weise ändert. Die Idee ist, dass, solange Ihre erste Annäherung Ihnen einen richtigen Datenrahmen gibt, können wir das Problem umgehen, indem Sie die order-Funktion verwenden.

max_length <- max(sapply(comb,length)) 

BI <- sapply(comb, function(x){ 
    .zeros <- rep(0, max_length - length(x)) 
    .rearange <- order(c(1:length(x), .zeros)) 
    c(x, .zeros)[.rearange] 
}) 

Ich habe getestet, dass dieser Code auf einem kleineren Testbeispiel arbeitet Ich habe, aber ich bin nicht sicher, dass dieses Beispiel Ihr ähnelt comb ...

Wenn dieser überarbeiteten Ansatz nicht der Fall ist arbeiten, dann ist es immer noch möglich zuerst den Datenrahmen mit Ihrem ursprünglichen Code zu erstellen, und dann eine Spalte zu der Zeit neu anordnen.

+0

Nein nicht ganz. Dies macht BI wieder zu einer Liste. – sfyn

+0

Aber wenn wir eine Liste haben, dann denke ich, können wir 'data.frame' darauf verwenden, um das gewünschte Ergebnis zu erzeugen. –

+0

Ich hatte versucht, es in einen Datenrahmen zu konvertieren, habe es aber in meiner ursprünglichen Antwort nicht erwähnt. Ich bekomme diesen Fehler 'Fehler in dat.frame (c (49.04, 48.7, 48.049997, 48.069997, 48.379999, 48.259999,: Argumente implizieren unterschiedliche Anzahl von Zeilen: 4666, 2686, 4431, 4627'. Diese abweichende Anzahl von Zeilen ist die Gleiches Problem, das mein ursprünglicher Code versucht hat zu lösen, also sind wir wieder bei Platz 1. – sfyn