1. ホーム
  2. r

[解決済み] dplyrで複数列の和を求める

2022-05-13 13:31:20

質問

私の質問は、データフレームの複数の列の値を合計し、この合計に対応する新しい列を作成することです。 dplyr . 列のデータエントリはバイナリ(0,1)です。私は、行単位での summarise_each または mutate_each の機能 dplyr . 以下はデータフレームの最小限の例です。

library(dplyr)
df=data.frame(
  x1=c(1,0,0,NA,0,1,1,NA,0,1),
  x2=c(1,1,NA,1,1,0,NA,NA,0,1),
  x3=c(0,1,0,1,1,0,NA,NA,0,1),
  x4=c(1,0,NA,1,0,0,NA,0,0,1),
  x5=c(1,1,NA,1,1,1,NA,1,0,1))

> df
   x1 x2 x3 x4 x5
1   1  1  0  1  1
2   0  1  1  0  1
3   0 NA  0 NA NA
4  NA  1  1  1  1
5   0  1  1  0  1
6   1  0  0  0  1
7   1 NA NA NA NA
8  NA NA NA  0  1
9   0  0  0  0  0
10  1  1  1  1  1

みたいなのが使えた。

df <- df %>% mutate(sumrow= x1 + x2 + x3 + x4 + x5)

というのがありますが、これだと各カラムの名前を書き出すことになります。私は50カラムほど持っています。 また、この処理を行うループの繰り返しでカラム名が変わってしまうので また、この操作を実装したいループの反復によってカラム名が変わるので、カラム名をつける必要がないようにしたいです。

どのようにすれば最も効率的にできるでしょうか? ご教示いただければ幸いです。

どのように解決するのですか?

dplyr >= 1.0.0を横断して使用しています。

を使って各行を合計する rowSums ( rowwise はどのようなアグリゲーションに対しても機能しますが、より遅いです)

df %>%
   replace(is.na(.), 0) %>%
   mutate(sum = rowSums(across(where(is.numeric))))

各列の合計

df %>%
   summarise(across(everything(), ~ sum(., is.na(.), 0)))

dplyr < 1.0.0

各行を合計する

df %>%
   replace(is.na(.), 0) %>%
   mutate(sum = rowSums(.[1:5]))

各カラムの合計を スーパーシード summarise_all :

df %>%
   replace(is.na(.), 0) %>%
   summarise_all(funs(sum))