2016-08-02 80 views
1

我正在尋找一種方法在Julia中迭代地填充數據框。在Julia中使用for循環迭代填充數據框

我有一個創建沿線多點的工作職能:

#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 

我試圖完成的下一步是使用與預先定義的一組投入運行在一個循環中make_lines功能所有的輸出在一個單一的數據幀,但我不能得到它的工作。

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 

起初我以爲這是我如何使用Dataframes,我從來沒有使用推!等過,但我得到這個代碼塊的工作

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

那麼,爲什麼當我運行for循環,我結束了只有它生產的最後數據幀?

我誤解了什麼嗎?從我讀過的Julia中的數據框與R中的數據框不同,但我無法圍繞如何實現這個工作。

回答

3

你很親密,但有幾個地方你的代碼被絆倒了。您目前有:

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 

這是不太你想要的,原因有二:

一個:這個片段是不是一個函數。因此它沒有意義,並且會導致問題,其中有return

兩個:在循環中的每一步,您都會重新創建您的數據框df,擦除您放在它之前的所有內容。這就是爲什麼,如你所說,你只能得到它產生的最後一個數據幀。相反,你會想是這樣的:

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 

注:我不能讓你的代碼去一個完全工作版本 - 永遠無法定義的對象stk_percenta在你的主要功能,所以我真的不知道該怎麼投入。但是,我相信如果你解決了這些問題,你可能會處在一個更好的位置(我爲他們創造了一些價值,並且工作得很好)。

性能提示:當您修復這些問題時,我的建議是將它們作爲您傳遞給函數的顯式參數。雖然如果它們只是全局空間中的變量,它仍然可以工作,但這會導致代碼在現在和將來都達不到最佳性能,並且可能會導致更糟糕的情況,例如混淆變量的範圍,當它們的值變化時不想要等等。最好從開始的旅程開始,Julia採用儘可能多的最佳實踐來編寫代碼。