Arrays groupby()在julia中使用两个数组?

Arrays groupby()在julia中使用两个数组?,arrays,group-by,julia,Arrays,Group By,Julia,我有两个维度相同的数组: a1 = [1,1,3,4,6,6] a2 = [1,2,3,4,5,6] 我想根据数组a1对它们进行分组,得到每组数组a2的平均值。 我的输出来自数组a2,如下所述: result: 1.5 3.0 4.0 5.5 请提出实现这项任务的方法。 谢谢 下面是一个使用DataFrames.jl的解决方案: julia> using DataFrames, Statistics julia> df = DataFrame(a1 = [1,1,3,4,6,6

我有两个维度相同的数组:

a1 = [1,1,3,4,6,6]
a2 = [1,2,3,4,5,6]
我想根据数组
a1
对它们进行分组,得到每组数组
a2
的平均值。 我的输出来自数组
a2
,如下所述:

result:
1.5
3.0
4.0
5.5
请提出实现这项任务的方法。
谢谢

下面是一个使用DataFrames.jl的解决方案:

julia> using DataFrames, Statistics

julia> df = DataFrame(a1 = [1,1,3,4,6,6], a2 = [1,2,3,4,5,6]);

julia> combine(groupby(df, :a1), :a2 => mean)
4×2 DataFrame
 Row │ a1     a2_mean
     │ Int64  Float64
─────┼────────────────
   1 │     1      1.5
   2 │     3      3.0
   3 │     4      4.0
   4 │     6      5.5
编辑:

以下是计时(与Julia中的通常情况一样,您需要记住,第一次运行某个函数时必须编译它,这需要时间):

请注意,例如类似数据的data.table(如果这是您的参考)速度明显较慢:

> library(data.table) # using 4 threads
> df = data.table(a1 = sample(1:1000, 10^8, replace=T), a2 = runif(10^8));
> system.time(df[, .(mean(a2)), by = a1])
   user  system elapsed 
   4.72    1.20    2.00 

如果您有兴趣在DataFrames.jl之外使用Chain.jl,BogumiłKamiński的答案可能如下所示:

julia> using DataFrames, Statistics, Chain

julia> df = DataFrame(a1 = [1,1,3,4,6,6], a2 = [1,2,3,4,5,6]);

julia> @chain df begin
           groupby(:a1)
           combine(:a2 => mean)
       end

4×2 DataFrame
 Row │ a1     a2_mean 
     │ Int64  Float64 
─────┼────────────────
   1 │     1      1.5
   2 │     3      3.0
   3 │     4      4.0
   4 │     6      5.5

话语:谢谢你的建议,非常感谢!!!我害怕转换过程中占用的时间和内存,因为最终的测试数据可能会很大,有没有办法只使用数组来实现这一点?我可以这样做
Array(组合(DataFrames.groupby((DataFrame(:a=>a,:a2=>a2)),:a1),:a2=>mean))[:,2]
但是我可以问一下,相比之下,在较大的数据上使用它会花费时间吗?占用的内存仅在第一次运行时使用,因为代码需要编译。即使对于大型阵列,操作也应该很快。我将用一个更大的例子更新这篇文章。如果您想使用纯数组,可以查看SplitApplyCombine.jl包,但是在这个测试用例中可能会慢一些。感谢您的详细解释,在这个场景中,我将坚持以下内容:)如果它是第一个参数,我认为不必使用u。您可以使用@chain简单地
groupby(:a1)
,这与combine@MoriartySnarly固定的!
julia> using DataFrames, Statistics, Chain

julia> df = DataFrame(a1 = [1,1,3,4,6,6], a2 = [1,2,3,4,5,6]);

julia> @chain df begin
           groupby(:a1)
           combine(:a2 => mean)
       end

4×2 DataFrame
 Row │ a1     a2_mean 
     │ Int64  Float64 
─────┼────────────────
   1 │     1      1.5
   2 │     3      3.0
   3 │     4      4.0
   4 │     6      5.5