在Julia的单个数据框中保存不同长度的数组

时间:2017-09-19 14:56:05

标签: arrays julia

我想保存输出可变长度数组的模拟结果。通常情况下,我会运行模拟,将其保存在数组中,将其与具有先前结果的数组连接,然后通过生成数据框然后使用CSV.write保存包含所有结果的数组。但是由于数组的长度可变,所以hcat()不会起作用。 下面是我想做的玩具示例。

output = zeros(5)
number_simulations = 10
for i = 1:number_simulations
    l = sample([4, 5, 6, 7])
    print(l)
    for j = 1:l
        new_out = zeros(l)
        hcat(output, new_out)
    end    
end
df = convert(DataFrame, output)
CSV.write("out.csv", df)

这会返回错误

DimensionMismatch("vectors must have same lengths").

是否有一个简单的解决方法可以让我在单独的列中包含每个模拟结果的文件?

1 个答案:

答案 0 :(得分:4)

这里的最佳做法可能是使用“高”/“长”/“整洁”数据集,其中将模拟数存储在一个向量中,而垂直堆叠的结果存储在另一个向量中(并且可能是三分之一)。

但要实现你所追求的目标,我只需将输出直接存储到DataArray s的向量中。然后你可以将它们的大小调整到最后的最大值:

julia> output = DataVector{Float64}[]
       number_simulations = 10
       for i = 1:number_simulations
           l = sample([4, 5, 6, 7])
           print(l)
           for j = 1:l
               push!(output, zeros(l)) # This converts the array to a DataVector
           end
       end
5746656565
julia> resize!.(output, maximum(length, output))
       DataFrame(output)
7×55 DataFrames.DataFrame
│ Row │ x1  │ x2  │ x3  │ x4  │ x5  │ x6  │ x7  │
├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│ 1   │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │
│ 2   │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │
│ 3   │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │
│ 4   │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │
│ 5   │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │ 0.0 │
│ 6   │ NA  │ NA  │ NA  │ NA  │ NA  │ 0.0 │ 0.0 │
│ 7   │ NA  │ NA  │ NA  │ NA  │ NA  │ 0.0 │ 0.0 │

⋮