2015-02-23 71 views
2

当我运行模拟时,我喜欢初始化一个大的空数组,并在模拟迭代到最后时填充它。我用res = Array(Real,(n_iterations,n_parameters))之类的东西来做这件事。不过,有命名的列是我的好选择,我认为这意味着使用DataFrame。但是,当我尝试执行类似res_df = convert(DataFrame,res)的操作时,它会引发错误。我想不是做这样的事情res_df = DataFrame(a=Array(Real,N),b=Array(Real,N),c=Array(Real,N),....)的建议通过回答一个更简洁的方法:julia create an empty dataframe and append rows to it在Julia中预分配已知大小的数据帧

回答

4

可以使用DataFrame(column_eltypes::Array{T,1},cnames::Array{T,1},nrows::Integer)构造:

julia> DataFrame([Real,Real,Real],[:a,:b,:c], 10000) 
10000x3 DataFrame 
| Row | a | b | c | 
|-------|----|----|----| 
| 1  | NA | NA | NA | 
| 2  | NA | NA | NA | 
⋮ 
| 9998 | NA | NA | NA | 
| 9999 | NA | NA | NA | 
| 10000 | NA | NA | NA | 

这么说,我高度建议您使用数组的具体类型而不是Real;例如,DataFrame([Float64, Float64, …。这样做会带来巨大的性能提升。

+0

如果您知道所有列的类型都是相同的,并且永远不会有未填充('NA')元素,那么可能会有其他数据结构可供您使用。看一下[NamedArrays.jl](https://github.com/davidavdav/NamedArrays.jl),或者如果你愿意乘坐你的裤子坐在不稳定的0.4上工作,你可以试试我的最近的进行中的工作[AxisArrays.jl](https://github.com/mbauman/AxisArrays.jl)。这两个项目都旨在更直接地增加具有维度名称和轴元数据的内置'Array',而DataFrames使用列集合方法。 – 2015-02-23 20:01:46

+0

谢谢你,还有关于Float64与Real的提示。 – 2015-02-27 02:35:32

相关问题