!横方向(行)に演算する 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 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 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/]