データフレームに列や行の合計を追記する関数 adorn_totals {janitor} の紹介です。
始めにパッケージのバージョンを確認します。
library(janitor)
packageVersion("janitor")[1] '2.2.0'サンプルとするデータフレーム sampledf を作成します。
n <- 10
sampledf <- tibble::tibble(CAT1 = head(LETTERS, n), CAT2 = seq(n) %>% as.character(), Value1 = seq(n), Value2 = seq(n) %>% rev())
sampledf$Value1[2] <- sampledf$Value2[5] <- NA
sampledf
class(sampledf)# A tibble: 10 × 4
CAT1 CAT2 Value1 Value2
<chr> <chr> <int> <int>
1 A 1 1 10
2 B 2 NA 9
3 C 3 3 8
4 D 4 4 7
5 E 5 5 NA
6 F 6 6 5
7 G 7 7 4
8 H 8 8 3
9 I 9 9 2
10 J 10 10 1
[1] "tbl_df" "tbl" "data.frame"1列目(CAT1)と2列目(CAT2)のクラスはキャラクター、3列目(Value1)と4列目(Value2)は数値です。Value1 の2つ目、Value2 の5つ目は NA としています。
始めに列の合計を追加します。引数 where を row に指定します。また、NA を除くために na.rm = T とします。
sampledf %>% adorn_totals(where = "row", na.rm = T) CAT1 CAT2 Value1 Value2
A 1 1 10
B 2 NA 9
C 3 3 8
D 4 4 7
E 5 5 NA
F 6 6 5
G 7 7 4
H 8 8 3
I 9 9 2
J 10 10 1
Total - 53 49最下段に Total 行が追加され、クラスが数値の列のみ、列の合計が追記されています。
na.rm = F としますと、
sampledf %>% adorn_totals(where = "row", na.rm = F) CAT1 CAT2 Value1 Value2
A 1 1 10
B 2 NA 9
C 3 3 8
D 4 4 7
E 5 5 NA
F 6 6 5
G 7 7 4
H 8 8 3
I 9 9 2
J 10 10 1
Total - NA NA合計は算出されません。
続いて行の合計を追加します。引数 where を col に指定します。
sampledf %>% adorn_totals(where = "col", na.rm = F) CAT1 CAT2 Value1 Value2 Total
A 1 1 10 11
B 2 NA 9 NA
C 3 3 8 11
D 4 4 7 11
E 5 5 NA NA
F 6 6 5 11
G 7 7 4 11
H 8 8 3 11
I 9 9 2 11
J 10 10 1 11右端にクラスが数値のセルの合計が行ごとに追記されています。
row と col を続けますと列と行の合計が追記されたデータフレームを作成できます。その場合、na.rm = T は片方のみで構いません。
sampledf %>%
adorn_totals(where = "row") %>%
adorn_totals(where = "col", na.rm = T) CAT1 CAT2 Value1 Value2 Total
A 1 1 10 11
B 2 NA 9 9
C 3 3 8 11
D 4 4 7 11
E 5 5 NA 5
F 6 6 5 11
G 7 7 4 11
H 8 8 3 11
I 9 9 2 11
J 10 10 1 11
Total - 53 49 102引数 name を利用して、合計の行と列の表記を Total から 合計 に変更します。
sampledf %>%
adorn_totals(where = "row", name = "合計") %>%
adorn_totals(where = "col", name = "合計", na.rm = T) CAT1 CAT2 Value1 Value2 合計
A 1 1 10 11
B 2 NA 9 9
C 3 3 8 11
D 4 4 7 11
E 5 5 NA 5
F 6 6 5 11
G 7 7 4 11
H 8 8 3 11
I 9 9 2 11
J 10 10 1 11
合計 - 53 49 102クラスが非数値の列の合計欄の記号を引数 fill で変更できます。
sampledf %>%
adorn_totals(where = "row", name = "合計", fill = "+++") %>%
adorn_totals(where = "col", name = "合計", na.rm = T) CAT1 CAT2 Value1 Value2 合計
A 1 1 10 11
B 2 NA 9 9
C 3 3 8 11
D 4 4 7 11
E 5 5 NA 5
F 6 6 5 11
G 7 7 4 11
H 8 8 3 11
I 9 9 2 11
J 10 10 1 11
合計 +++ 53 49 102fill には絵文字が利用できます。
library(emoji)
sampledf %>%
adorn_totals(where = "row", name = "合計", fill = emoji("smile")) %>%
adorn_totals(where = "col", name = "合計", na.rm = T) CAT1 CAT2 Value1 Value2 合計
A 1 1 10 11
B 2 NA 9 9
C 3 3 8 11
D 4 4 7 11
E 5 5 NA 5
F 6 6 5 11
G 7 7 4 11
H 8 8 3 11
I 9 9 2 11
J 10 10 1 11
合計 😄 53 49 102合計を求める列や行を選択できます。Value1 列のみ合計を求めます。
sampledf_value1 <- sampledf %>% adorn_totals(where = "row", name = "合計", fill = "-", na.rm = T, "Value1")
sampledf_value1 CAT1 CAT2 Value1 Value2
A 1 1 10
B 2 NA 9
C 3 3 8
D 4 4 7
E 5 5 <NA>
F 6 6 5
G 7 7 4
H 8 8 3
I 9 9 2
J 10 10 1
合計 - 53 -sampledf_value1$Value2 %>% class()[1] "character"選択されなかった 元数値列の Value2 は文字列に変換されます。よって、そのまま行の合計を求めましても、
sampledf %>%
adorn_totals(where = "row", name = "合計", fill = "-", na.rm = T, "Value1") %>%
adorn_totals(where = "col", name = "合計", na.rm = T) CAT1 CAT2 Value1 Value2 合計
A 1 1 10 1
B 2 NA 9 0
C 3 3 8 3
D 4 4 7 4
E 5 5 <NA> 5
F 6 6 5 6
G 7 7 4 7
H 8 8 3 8
I 9 9 2 9
J 10 10 1 10
合計 - 53 - 53行の合計に Value2 の値が反映されません。
行の合計対象を Value1 のみとします。
sampledf %>%
adorn_totals(where = "row", name = "合計", fill = "-", na.rm = T) %>%
adorn_totals(where = "col", name = "合計", fill = "", na.rm = T, "Value1") CAT1 CAT2 Value1 Value2 合計
A 1 1 10 1
B 2 NA 9 0
C 3 3 8 3
D 4 4 7 4
E 5 5 NA 5
F 6 6 5 6
G 7 7 4 7
H 8 8 3 8
I 9 9 2 9
J 10 10 1 10
合計 - 53 49 53行の合計対象を Value2 のみとします。
sampledf %>%
adorn_totals(where = "row", name = "合計", fill = "-", na.rm = T) %>%
adorn_totals(where = "col", name = "合計", fill = "", na.rm = T, "Value2") CAT1 CAT2 Value1 Value2 合計
A 1 1 10 10
B 2 NA 9 9
C 3 3 8 8
D 4 4 7 7
E 5 5 NA 0
F 6 6 5 5
G 7 7 4 4
H 8 8 3 3
I 9 9 2 2
J 10 10 1 1
合計 - 53 49 49合計を追記する対象はデータフレームまたはデータフレームのリストのみです。マトリックスを渡すと以下の通りにエラーが返ります。
sampledf %>%
as.matrix() %>%
adorn_totals()adorn_totals(.) でエラー:
adorn_totals() must be called on a data.frame or list of data.frames
データフレームのリストを渡します。
list(sampledf, sampledf) %>% adorn_totals(where = "row", na.rm = T)[[1]]
CAT1 CAT2 Value1 Value2
A 1 1 10
B 2 NA 9
C 3 3 8
D 4 4 7
E 5 5 NA
F 6 6 5
G 7 7 4
H 8 8 3
I 9 9 2
J 10 10 1
Total - 53 49
[[2]]
CAT1 CAT2 Value1 Value2
A 1 1 10
B 2 NA 9
C 3 3 8
D 4 4 7
E 5 5 NA
F 6 6 5
G 7 7 4
H 8 8 3
I 9 9 2
J 10 10 1
Total - 53 49以上です。

