julia - 在 Julia 中编写用于传递 GroupedDataFrame 的函数方法

标签 julia dataframes.jl

我编写了一个如下所示的函数:

gini(v::Array{<:Real,1}) = (2 * sum([x*i for (i,x) in enumerate(sort(v))]) / sum(sort(v)) - (length(v)+1))/(length(v))

当传递 VectorDataFrame 时,此函数效果很好。例如:

gini(collect(1:1:10))
# 0.3

using DataFrames # DataFrames v1.3.2

df = DataFrame(v = collect(1:1:10),
               group = repeat([1, 2], 5))

combine(df, :v => gini)
#1×1 DataFrame
# Row │ v_gini  
#     │ Float64
#─────┼─────────
#   1 │     0.3

但是,与其他采用向量作为参数的函数(例如 Statistics.mean)不同,它在传递 GroupedDataFrame 时会抛出 MethodError .

combine(groupby(df, :group), :v => gini)
#  nested task error: MethodError: no method matching #gini(::SubArray{Int64, 1, Vector{Int64}, Tuple{SubArray{Int64, 1, #Vector{Int64}, Tuple{UnitRange{Int64}}, true}}, false})
 #   Closest candidates are:
  #    gini(::Vector{<:Real})

如何编写像上面那样在传递 GroupedDataFrame 时起作用的函数?

最佳答案

您需要将方法签名更改为:

gini(v::AbstractVector{<:Real})

重点是,combine 传递了一个向量 View (它没有 Vector 类型,而是 SubArray)。因此,您的函数需要允许任何向量,而不仅仅是 Vector

关于julia - 在 Julia 中编写用于传递 GroupedDataFrame 的函数方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71712487/

相关文章:

python - Julia 转置分组数据传递列选择器的元组

julia - 将具有常量值的列添加到 DataFrame

dataframe - 从 Postgres 检索时如何防止 DataFrame 中的列成为小数

dataframe - 高效设置交集以获取DataFrame中的行

julia - 如何运行Julia项目?

scipy - 无法为通过 pycall 在 julia 中导入的 scipy rbf 分配自定义径向?

julia - 我无法直接使用 `subset` 在 Julia 的 DataFrames 中使用 `in` 过滤许多值

julia - 当使用符号 ("x") 表达式从 DataFrame 中进行 @select 时,DataFramesMeta.js 中的表达式格式错误

使用 Plots 或 PyPlot 在 Julia 中绘制 3D 表面

Julia 变量消失/改变