Julia:在DataFramesMeta和Lazy中使用groupby

时间:2018-05-26 23:05:04

标签: julia

我是Julia的新手,并且无法弄清楚如何在Lazy / DataFramesMeta中使用groupby函数。似乎Lazy与DataFrames存在名称空间冲突,但我不确定如何解决它。

using DataFrames, DataFramesMeta, RDatasets
#works
iris = dataset("datasets", "iris")
iris = @linq iris |>
        groupby(:Species) |>
        transform(mean_sepal_length = mean(:SepalLength))

using Lazy
#doesn't work
iris2 = dataset("datasets", "iris")
iris2 = @> begin
        iris2
        @groupby(:Species)
        @transform(mean_sepal_length = mean(:SepalLength))
end


#doesnt work
iris2 = dataset("datasets", "iris")
iris2 = @> begin
        iris2
        @DataFrames.groupby(:Species)
        @transform(mean_sepal_length = mean(:SepalLength))
end

#this works
iris2 = dataset("datasets", "iris")
iris2 = @> begin
        iris2
        @transform(mean_sepal_length = mean(:SepalLength))
end

1 个答案:

答案 0 :(得分:1)

您必须将合格的函数名称传递给@>并记住没有@groupby宏(它是一个函数),例如:

julia> using DataFrames, DataFramesMeta, RDatasets

julia> iris = dataset("datasets", "iris");

julia> a = @linq iris |>
           groupby(:Species) |>
           transform(mean_sepal_length = mean(:SepalLength));

julia> using Lazy
WARNING: using Lazy.groupby in module Main conflicts with an existing identifier.

julia> b = @> begin
           iris
           DataFrames.groupby(:Species)
           @transform(mean_sepal_length = mean(:SepalLength))
           end;

julia> a == b
true

实际上,您唯一的问题是当您想要使用@linq时,因为它不接受合格的名称:

julia> a = @linq iris |>
           DataFrames.groupby(:Species) |>
           transform(mean_sepal_length = mean(:SepalLength))
ERROR: MethodError: Cannot `convert` an object of type Expr to an object of type DataFramesMeta.SymbolParameter
This may have arisen from a call to the constructor DataFramesMeta.SymbolParameter(...),
since type constructors fall back to convert methods.

解决方法是创建一个引用所需方法的变量:

julia> gb = DataFrames.groupby
groupby (generic function with 4 methods)

julia> a = @linq iris |>
           gb(:Species) |>
           transform(mean_sepal_length = mean(:SepalLength))

通过。