2016-08-02 42 views
1

Ich bin auf der Suche nach einer Möglichkeit, einen Datenrahmen in Julia iterativ zu füllen.Iterativ füllen Datenfelder mit einer For-Schleife in Julia

Ich habe eine Arbeitsfunktion, die mehrere Punkte entlang einer Linie erstellt:

#function to draw QMD lines 
using DataFrames 
function make_lines(qmd) 
    BA=Float64[] 
    TPA=Float64[] 
    QMD=Int[] 
    for i in stk_percent 
     tpa= 1*(i*10)/(a[1]+a[2]*(-0.259+0.973*qmd)+a[3]*qmd^2) 
     ba=pi*(qmd/24)^2*tpa 
     push!(TPA,tpa) 
     push!(BA,ba) 
     push!(QMD,qmd) 
    end 
    return DataFrame(TPA=TPA,BA=BA,QMD=QMD) 
end 

Der nächste Schritt I zu erreichen versuche ist die make_lines Funktion in einer Schleife ausgeführt werden unter Verwendung eines vordefinierten Satz von Eingängen mit alle Ausgaben in einem einzigen Datenrahmen, aber ich kann es nicht zum Funktionieren bringen.

dia = [7, 8, 10, 12, 14, 16, 18, 20, 22] 

# can't get for loop to append all the data frames? 
for i in dia 
    df=DataFrame(TPA=Float64[],BA=Float64[],QMD=Int[]) 
    append!(df,make_lines(i)) 
return df 
end 

Zuerst dachte ich, dass ich Dataframes benutze, ich habe Push nie benutzt! etc vor, aber ich habe diesen Code Chunk

zu arbeiten
#this works to combine dataframe 
test=make_lines(22) 
test2=make_lines(8) 
test[:] 
append!(test,test2) 

Warum also, wenn ich die for-Schleife laufen, beende ich nur mit dem letzten Datenrahmen bis es produziert?

Fehle ich etwas falsch? Von dem, was ich gelesen habe, arbeiten die Dataframes in Julia anders als die Daten in R, aber ich kann nicht sagen, wie das funktioniert.

Antwort

3

Sie sind ziemlich nah, aber es gibt ein paar Orte, an denen Sie in Ihrem Code stolpern. Sie haben zur Zeit:

dia = [7, 8, 10, 12, 14, 16, 18, 20, 22] 

# can't get for loop to append all the data frames? 
for i in dia 
    df=DataFrame(TPA=Float64[],BA=Float64[],QMD=Int[]) 
    append!(df,make_lines(i)) 
return df 
end 

Das ist nicht ganz das, was man aus zwei Gründen wollen:

One: Dieser Ausschnitt ist keine Funktion. Es macht also keinen Sinn und wird Probleme verursachen, return drin zu haben.

Zwei: Bei jedem Schritt in Ihrer Schleife, erstellen Sie Ihren Datenrahmen df von Grund auf neu, Löschen von allem, was Sie vor ihm gestellt. Deshalb haben Sie, wie Sie sagen, nur den letzten Datenrahmen, den sie erzeugt. Stattdessen würden Sie so etwas wie:

dia = [7, 8, 10, 12, 14, 16, 18, 20, 22] 

df=DataFrame(TPA=Float64[],BA=Float64[],QMD=Int[]) 
for i in dia 
    append!(df,make_lines(i)) 
end 

Hinweis: Ich kann nicht eine völlig funktionsfähige Version des Codes gehen bekommen konnte - die Objekte stk_percent und a in Ihre Hauptfunktion nie definiert bekommen, so dass ich nicht wirklich Ich weiß, was ich für diese Leute tun soll. Aber ich glaube, dass Sie, wenn Sie diese Probleme beheben, wahrscheinlich an einem besseren Ort sind (ich habe einige Werte für sie erfunden und es hat gut funktioniert).

Leistung Tipp: Wenn Sie diese beheben, wäre meine Empfehlung, sie als explizite Argumente zu machen, die Sie an Ihre Funktion übergeben. Obwohl es immer noch funktioniert, wenn sie nur Variablen im globalen Raum sind, führt dies zu einer suboptimalen Leistung Ihres Codes, jetzt und in der Zukunft, und möglicherweise schlimmeren Dingen, wie der Umfang der Variablen zu verwirren, wenn sich ihre Werte ändern Ich möchte nicht, usw. Am besten beginnen Sie am Anfang Ihrer Reise mit Julia, die so viele Best Practices anwendet, wie Sie Ihren Code so schreiben, wie es praktikabel ist.