Phu*_*uoc 4 group-by function set dataframe julia
我想将一组函数应用于值并获取一组值作为输出.我在help?> groupby(DataFrames包)中看到我们可以做到:
> df |> groupby(:a) |> [sum, length]
> df |> groupby([:a, :b]) |> [sum, length]
Run Code Online (Sandbox Code Playgroud)
但我们能做到吗
> [sum, length](groupby([:a, :b]))
MethodError: objects of type Array{Function,1} are not callable
square brackets [] for indexing an Array.
eval_user_input(::Any, ::Base.REPL.REPLBackend) at ./REPL.jl:64
in macro expansion at ./REPL.jl:95 [inlined]
in (::Base.REPL.##3#4{Base.REPL.REPLBackend})() at ./event.jl:68
Run Code Online (Sandbox Code Playgroud)
甚至
> [sum, length](1:5)
Run Code Online (Sandbox Code Playgroud)
我期待输出:
[15, 5]
Run Code Online (Sandbox Code Playgroud)
是的,不是.(即是的,这是可能的,但不,不是那种语法):
|>和数据帧不是一般语法.这|>就是为数据帧定义方法的方法.在文件中看到它的定义grouping.jl(第377行),你会发现它只是另一个函数的包装器,它被定义为接受一个函数或一个函数向量.
PS:请注意,将|>参数"管道"到函数中的泛型只需要右侧的1参数函数,并且与此特定的"数据帧重载"方法几乎没有关系.
julia> a = [1 2 3;2 3 4];
julia> [f(a) for f in [sum, length, size]]
3-element Array{Any,1}:
15
6
(2,3)
Run Code Online (Sandbox Code Playgroud)
或使用map:
julia> map( (x) -> x(a), [sum, length, size])
Run Code Online (Sandbox Code Playgroud)
等等
|>实现这一点,显然你也可以这样做:
julia> a |> (x) -> [sum(x), length(x), size(x)]
Run Code Online (Sandbox Code Playgroud)
但可能会失败你想要做的目的:)