使用Julia中的for循环迭代填充数据帧

时间:2016-08-02 23:53:36

标签: 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)
        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的方式,我从未使用过Push!等之前,我得到了这个代码块工作

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

那么为什么当我运行for循环时,我最终只得到它产生的最后一个数据帧?

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

2 个答案:

答案 0 :(得分: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_percent

注意:我无法获得完整工作版本的代码 - 主函数中的对象aspan永远不会被定义,所以我真的不知道要放什么为了那些。但是,我相信如果你解决了这些问题,你可能会处于一个更好的位置(我为它们制定了一些值并且工作正常)。

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

答案 1 :(得分:0)

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

df = DataFrame([DateTime;fill(Float64, 2);String;fill(Float64, 2)],
["Date","A","B","Letter","C","D"])

然后我可以通过在 for 循环中使用 rename!append! 函数来附加结果以填充新的数据帧。 这对于包含大量列的大型数据集非常有用。