Юлия: Использование группового режима с DataFramesMeta и Lazy - PullRequest
0 голосов
/ 27 мая 2018

Я новичок в Джулии и не могу понять, как использовать функцию groupby с Lazy / DataFramesMeta.Кажется, что у 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 голосов
/ 27 мая 2018

Вы должны передать квалифицированное имя функции в @> и помнить, что нет макроса @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))

.

...