如何在朱莉娅中 prop.table()

How to prop.table() in julia

我正在尝试从 R 迁移到 Julia。

所以我有一个包含 2 个价格列和 2 个条件列的数据集,告诉我价格是“便宜”还是“昂贵”。

所以我想统计有多少“便宜”或“昂贵”的条目。

所以使用包 DataStructures 我得到了这个:

using DataStructures
counter(df.p_orellana)

Accumulator{Union{Missing, String}, Int64} with 3 entries:
  "expensive"   => 18
  missing  => 2
  "cheap" => 22

这与 R 中的 table() 函数相同。

有什么方法可以使这些值成比例吗?

在 R 中它将是 prop.Table() 函数,但我不确定如何使用 Julia 来实现。

我想要:

Accumulator{Union{Missing, String}, Int64} with 3 entries:
  "expensive"   => 0.4285
  missing  => 0.0476
  "cheap" => 0.5238

提前致谢!

使用 FreqTables.jl 包。

这是一个例子:

julia> using FreqTables

julia> data = [fill("expensive", 18); fill(missing, 2); fill("cheap", 22)];

julia> freqtable(data)
3-element Named Vector{Int64}
Dim1      │
──────────┼───
cheap     │ 22
expensive │ 18
missing   │  2

julia> proptable(data)
3-element Named Vector{Float64}
Dim1      │
──────────┼─────────
cheap     │  0.52381
expensive │ 0.428571
missing   │ 0.047619

结果按排序顺序显示。如果您想要其他顺序,请另外使用 CategoricalArrays.jl 包并设置适当的级别顺序:

julia> using CategoricalArrays

julia> cat_data = categorical(data, levels=["expensive", "cheap"]);

julia> freqtable(cat_data)
3-element Named Vector{Int64}
Dim1        │
────────────┼───
"expensive" │ 18
"cheap"     │ 22
missing     │  2

julia> proptable(cat_data)
3-element Named Vector{Float64}
Dim1        │
────────────┼─────────
"expensive" │ 0.428571
"cheap"     │  0.52381
missing     │ 0.047619

添加 base Julia 方法。
函数 tableprop 可以放入 ~/.julia/config/startup.jl 以自动加载。

function tableprop(data::Vector)
  uniq = unique(data)
  res = [sum(data .=== i) for i in uniq]
  try
    DataFrame(data=uniq, count=res, prop=res/sum(res))
  catch
    hcat(uniq, res, res/sum(res))
  end
end

julia> using DataFrames # just for pretty print

julia> tableprop(df)
3×3 DataFrame
 Row │ data       count  prop    
     │ String?    Int64  Float64 
─────┼───────────────────────────
   1 │ cheap          5      0.5
   2 │ expensive      3      0.3
   3 │ missing        2      0.2

数据

julia> df = ["cheap","expensive",missing,"cheap","cheap",
                     "expensive","expensive","cheap",missing,"cheap"]
10-element Vector{Union{Missing, String}}:
 "cheap"
 "expensive"
 missing
 "cheap"
 "cheap"
 "expensive"
 "expensive"
 "cheap"
 missing
 "cheap"