2016-08-02 81 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采用尽可能多的最佳实践来编写代码。