I.DataFramesMeta
次に解説があります。
https://github.com/JuliaData/DataFramesMeta.jl
ライブラリDataFramesMetaを用いると、データフレームを効率的よく処理できます。Rのdplyrに似た機能を持ちます。上の文書にの対応表があります。
<code>Julia dplyr --------------------------- @where filter @transform mutate @by groupby group_by @based_on summarise/do @orderby arrange @select select</code>
II.グループ分けして集計
1.ライブラリとデータの読み込み
ライブラリとWeb上の英語と数学のサンプル・データを読み込みます。
using Gadfly
using CSV, DataFrames
using DataFramesMeta
using HTTP
using Statistics
# load the data
resp = HTTP.request("GET", "hhttps://pastebin.com/raw/nWkAe1qR")
df0 = CSV.read(IOBuffer(String(resp.body)))
2.平均点の算出
英語と数学の平均点をベースのmean()で算出します。
julia> mean(df0[:english])
42.931
julia> mean(df0[:japanese])
63.45399999999999
3.nationalityでグループ分けして平均を算出
gropupbyでグループ分けし、@based_on()で列と関数を指定して集計
# 3列を取り出す
df0_selected = @select(df0, :english, :japanese, :nationality);
# nationalityでグループ分けする
g = groupby(df0_selected, :nationality);
# 出身国別の平均点を算出
@based_on(g, mean = mean(:english))
5×2 DataFrame │ Row │ nationality │ mean │ │ │ String │ Float64 │ ├─────┼─────────────┼─────────┤ │ 1 │ japanese │ 37.1333 │ │ 2 │ nepal │ 69.3115 │ │ 3 │ indonesia │ 51.1 │ │ 4 │ china │ 43.15 │ │ 5 │ vietnam │ 45.8333 │
III.パイプ演算子を使用
パイプ演算子(|>)を用いてIIを完結に書き直します。
df0 |> @select(:english, :japanese, :nationality)でよさそうですが、エラーになりました。
julia>df0 |> @select(:english, :japanese, :nationality)
ERROR: MethodError: no method matching getindex(::Symbol, ::typeof(!), ::Symbol)
@linqで初めて、あとの@を除くとよいようです。このあたりはまだ十分理解していません。
julia> @linq df0 |> select(:english, :japanese, :nationality) |> groupby(:nationality) |> based_on(mean = mean(:english)) 5×2 DataFrame │ Row │ nationality │ mean │ │ │ String │ Float64 │ ├─────┼─────────────┼─────────┤ │ 1 │ japanese │ 37.1333 │ │ 2 │ nepal │ 69.3115 │ │ 3 │ indonesia │ 51.1 │ │ 4 │ china │ 43.15 │ │ 5 │ vietnam │ 45.8333 │
Rのdplyrとほぼ同等の機能がありそうです。