我希望找到一种在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中的数据帧的工作方式不同,但我无法理解如何使其工作。
答案 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
注意:我无法获得完整工作版本的代码 - 主函数中的对象a
和span
永远不会被定义,所以我真的不知道要放什么为了那些。但是,我相信如果你解决了这些问题,你可能会处于一个更好的位置(我为它们制定了一些值并且工作正常)。
性能提示:当您修复这些内容时,我的建议是将它们作为您传递给函数的显式参数。虽然如果它们只是全局空间中的变量,它仍然可以工作,但这会导致代码在现在和未来的性能都不理想,并且可能会导致更糟糕的事情,比如混淆变量的范围,当你改变它们的值时最好从一开始就开始,Julia采用尽可能多的最佳实践来编写代码。
答案 1 :(得分:0)
通过提供变量类型和列名,我设法创建了一个空白数据框
df = DataFrame([DateTime;fill(Float64, 2);String;fill(Float64, 2)],
["Date","A","B","Letter","C","D"])
然后我可以通过在 for 循环中使用 rename! 和 append! 函数来附加结果以填充新的数据帧。 这对于包含大量列的大型数据集非常有用。