- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!横方向(行)に演算する
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/]