【问题标题】:Most elegant way to get a array with all combinations of given elements获取具有给定元素的所有组合的数组的最优雅方法
【发布时间】:2021-01-16 18:16:44
【问题描述】:

目前最优雅的方法是获取列名包含给定元素的所有组合的数组?来自 R 的函数 expand.grid() 的一些最接近的类似物。我在这个问题上遇到的所有讨论要么是关于这个问题的稍微不同的表述,要么是在非常旧版本的 Julia 时代进行的。目前我找到的最合理的解决方案是这样的:

using DataFrames
xy = [[x,y] for x in 0:0.25:1 for y in 0:0.25:1]
xy_array = permutedims(reshape(hcat(xy...), (length(xy[1]), length(xy))))
df = DataFrame(x = xy_array[:,1], y = xy_array[:,2])

R 中类似的表达式可以写得更紧凑:

xy_comb <- expand.grid(x=seq(0, 1, 0.25), y=seq(0, 1, 0.25))

在 Julia 中写同样的表达式还有更简洁的形式吗?

【问题讨论】:

    标签: julia combinations


    【解决方案1】:

    让我展示几个选项,这些选项还将展示 DataFrames.jl 与 Tables.jl 的集成以及在这种情况下如何使用它。

    你可以做例如这个:

    julia> df = DataFrame(x=Float64[], y=Float64[])
    0×2 DataFrame
    
    julia> foreach(x -> push!(df, x), Iterators.product(0:0.25:1, 0:0.25:1))
    
    julia> df
    25×2 DataFrame
     Row │ x        y
         │ Float64  Float64
    ─────┼──────────────────
       1 │    0.0      0.0
       2 │    0.25     0.0
       3 │    0.5      0.0
      ⋮  │    ⋮        ⋮
      23 │    0.5      1.0
      24 │    0.75     1.0
      25 │    1.0      1.0
             19 rows omitted
    

    或者这个(这会更快,但前一种模式在您动态生成数据框行的一般情况下很有用):

    julia> rename!(DataFrame(Iterators.product(0:0.25:1, 0:0.25:1)), [:x, :y])
    25×2 DataFrame
     Row │ x        y
         │ Float64  Float64
    ─────┼──────────────────
       1 │    0.0      0.0
       2 │    0.25     0.0
       3 │    0.5      0.0
      ⋮  │    ⋮        ⋮
      23 │    0.5      1.0
      24 │    0.75     1.0
      25 │    1.0      1.0
             19 rows omitted
    

    DataFrame(Iterators.product(0:0.25:1, 0:0.25:1)) 的问题在于默认列名是 "1""2",您可能想要更改它们。

    因此,您也可以像这样生成NamedTuples 而不是Tuples

    julia> DataFrame((x=x,y=y) for x in 0:0.25:1 for y in 0:0.25:1)
    25×2 DataFrame
     Row │ x        y
         │ Float64  Float64
    ─────┼──────────────────
       1 │    0.0      0.0
       2 │    0.0      0.25
       3 │    0.0      0.5
      ⋮  │    ⋮        ⋮
      23 │    1.0      0.5
      24 │    1.0      0.75
      25 │    1.0      1.0
             19 rows omitted
    

    具有不同的行顺序。

    【讨论】:

      猜你喜欢
      • 2015-03-18
      • 2014-12-17
      • 2015-01-26
      • 2017-06-06
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多