我是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
答案 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))
通过。