首页 > 解决方案 > Julia - 如何按组聚合许多列

问题描述

使用 Julia 1.0

我正在尝试按组聚合(在本例中为均值中心)几列,并寻找一种循环遍历列的方法,而不是显式地编写所有列名。以下内容有效,但我正在为我有很多列的情况寻找更简洁的语法。

using DataFrames, Statistics
dd=DataFrame(A=["aa";"aa";"bb";"bb"], B=[1.0;2.0;3.0;4.0], C=[5.0;5.0;10.0;10.0])

by(dd, :A, df -> DataFrame(bm = df[:B].-mean(df[:B]), cm = df[:C].-mean(df[:C])))

有没有办法循环 [:B, :C] 而不是为每个单独编写语句?

标签: juliaaggregate

解决方案


您可以使用aggregate

julia> centered(col) = col .- mean(col)
centered (generic function with 1 method)

julia> aggregate(dd, :A, centered)
4×3 DataFrame
│ Row │ A      │ B_centered │ C_centered │
│     │ String │ Float64    │ Float64    │
├─────┼────────┼────────────┼────────────┤
│ 1   │ aa     │ -0.5       │ 0.0        │
│ 2   │ aa     │ 0.5        │ 0.0        │
│ 3   │ bb     │ -0.5       │ 0.0        │
│ 4   │ bb     │ 0.5        │ 0.0        │

请注意,函数名称用作后缀。如果您需要更多自定义后缀,请使用by并传递一个更花哨的第三个参数,该参数会遍历传递的列,并为其提供适当的名称。


推荐阅读