🛠️
Rで行ったデータ加工をjuliaで書くと -group_by() & mutate()
Rで書いたプログラムをjuliaで書き直す必要が出てきたので、RとJuliaの書き方を比較する意味を込めて(未来の自分のための備忘録)としてメモしておく。
Rでデータに対してよく行う加工として、列をIDごとに集計することなく計算することがあるので、それをjuliaで書くとどうなるかを残しておく。
dplyrを使うと
df <- data.frame(
id = c(1, 1, 2, 2, 2, 3),
n = c(1, 3, 5, 5, 5, 4)
)
df %>%
group_by(id) %>%
mutate(
per = n / sum(n)
)
#> # A tibble: 6 × 3
#> # Groups: id [3]
#> id n per
#> <dbl> <dbl> <dbl>
#> 1 1 1 0.25
#> 2 1 3 0.75
#> 3 2 5 0.333
#> 4 2 5 0.333
#> 5 2 5 0.333
#> 6 3 4 1
のように、集計を行わず計算する方法はjuliaだと
juliaのDataFramesを使うと
using DataFrames
df = DataFrame(
id = [1, 1, 2, 2, 2, 3],
n = [1, 3, 5, 5, 5, 4]
)
# id ごとに n / sum(n) を計算して新しい列 n_share を追加
df2 = transform(groupby(df, :id),
:n => (x -> x ./ sum(skipmissing(x))) => :n_share
)
first(df2, 6)
#> 6×3 DataFrame
#> Row id n n_share
#> Int64 Int64 Float64
#> 1 1 1 0.25
#> 2 1 3 0.75
のようにすればいい
juliaのコードの説明
-
transform(data, :a => FUNCTION => :new_col)- rのdplyr::mutateと同じで、dataに新しく
new_colを追加するということを行う -
:aの列をFUNCTION部分で加工した結果を:new_colとする
- rのdplyr::mutateと同じで、dataに新しく
-
x -> ...は無名関数である。map(x -> x^2 + 1, [1,2])のように使うことができる
Discussion