行単位の演算

横方向(行)に演算する

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()などのようにスカラーしか返してこない関数を行単位で適用したいときに、有力に使える。

参照