トップ 一覧 検索 ヘルプ RSS ログイン 印刷

行単位の演算の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!横方向(行)に演算する

Rは列単位での演算はとても便利だが、行単位での演算がやってみると割と面倒。
おそらく、列はデータの項目、行はデータを表すという考え方が背景にある。
apply() を使うと行単位での関数の適用ができる。

 apply(dat, 1, sum)

しかし、datがデータフレームの場合、数値型だけではないのでエラーが出るし特定の列だけを演算の対象にしたい場合に困る。

!rowwise()とc_across()を使う。

 dat <- tibble(
  a = sample(1:6,100,replace=TRUE),
  b = sample(1:6,100,replace=TRUE),
  c = sample(1:6,100,replace=TRUE)
 )

 dat %>% 
  rowwise() %>% 
  mutate(res = sum(c_across(), na.rm=TRUE)) %>% 
  ungroup()


!rowwise()を使うと、行単位で演算が適用できる。違いは以下を。

 > df |> rowwise() |> mutate(m = mean(c(x,y,z)))
 # A tibble: 6 × 4
 # Rowwise: 
        x     y     z     m
    <dbl> <dbl> <dbl> <dbl>
 1 0.407  0.553 0.891 0.617
 2 0.0314 0.840 0.197 0.356
 3 0.291  0.699 0.524 0.505
 4 0.370  0.217 0.815 0.467
 5 0.951  0.483 0.950 0.795
 6 0.897  0.515 0.527 0.646
 
 > df |>  mutate(m = mean(c(x,y,z)))
 # A tibble: 6 × 4
        x     y     z     m
    <dbl> <dbl> <dbl> <dbl>
 1 0.407  0.553 0.891 0.564
 2 0.0314 0.840 0.197 0.564
 3 0.291  0.699 0.524 0.564
 4 0.370  0.217 0.815 0.564
 5 0.951  0.483 0.950 0.564
 6 0.897  0.515 0.527 0.564

mの列を見ると、rowwise()を適用した上の演算は、各行ごとに演算ができているが、適用していない下のほうはm列の値が全て同じになっている。

通常、Rではベクトル同士の演算は、ベクトルを返してくるが、mean()、sum()などのようにスカラーしか返してこない関数を行単位で適用したいときに、有力に使える。

:参照:

* [行方向にグループ化して、行方向で計算・集計を行う方法|https://r-online-course.netlify.app/post/2021-05-21-use-rowwise-to-remove-rows-with-nas/]