For loop 在Julia中使用for循环迭代填充数据帧

For loop 在Julia中使用for循环迭代填充数据帧,for-loop,dataframe,julia,For Loop,Dataframe,Julia,我正在寻找一种在Julia中迭代填充数据帧的方法 我有一个沿直线创建多个点的工作函数: #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

我正在寻找一种在Julia中迭代填充数据帧的方法

我有一个沿直线创建多个点的工作函数:

#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_line函数,使用一组预定义的输入,将所有输出放在一个数据帧中,但我无法让它工作

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
起初我以为这就是我使用数据帧的方式,我从来没有使用过推送!等,但我得到了这个代码块的工作

#this works to combine dataframe
test=make_lines(22)
test2=make_lines(8)
test[:]
append!(test,test2)
那么,为什么当我运行for循环时,我只得到它生成的最后一个数据帧


我是不是误解了什么?从我所读到的Julia中的数据帧与R中的数据帧的工作方式不同,但我无法理解如何使其工作。

您非常接近,但在代码中有几个地方您会被绊倒。您目前有:

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
这不是您想要的,原因有二:

One:此代码段不是函数。因此,在其中包含
return
是没有意义的,并且会导致问题

Two:在循环的每个步骤中,您都从头开始重新创建数据帧
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_百分比
a
从未定义过,因此我真的不知道该为它们添加什么。但是,我相信,如果你解决了这些问题,你可能会处于一个更好的位置(我为它们制定了一些价值观,而且效果很好)


性能提示:当您修复这些问题时,我的建议是将它们作为传递给函数的显式参数。虽然如果它们只是全局空间中的变量,它仍然可以工作,但这将导致代码的性能不理想,无论是现在还是将来,以及潜在的更糟糕的事情,比如混淆变量的范围,在您不想更改它们的值时,等等。最好从一开始就开始,Julia在编写代码时采用尽可能多的最佳实践。

我通过提供变量类型和列名创建了一个空白数据框

df = DataFrame([DateTime;fill(Float64, 2);String;fill(Float64, 2)],
["Date","A","B","Letter","C","D"])
然后,我可以使用重命名来添加结果以填充新的数据帧然后追加for循环中运行。 这对于具有许多列的大型数据集非常有用