🛠️

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とする
  • x -> ...は無名関数である。map(x -> x^2 + 1, [1,2])のように使うことができる

Discussion