データフレームに列や行の合計を追記する関数 adorn_totals {janitor} の紹介です。
始めにパッケージのバージョンを確認します。
library(janitor)
packageVersion("janitor")
[1] '2.2.0'
サンプルとするデータフレーム sampledf を作成します。
<- 10
n <- 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
sampledfclass(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 とします。
%>% adorn_totals(where = "row", na.rm = T) sampledf
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 としますと、
%>% adorn_totals(where = "row", na.rm = F) sampledf
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 に指定します。
%>% adorn_totals(where = "col", na.rm = F) sampledf
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 102
fill には絵文字が利用できます。
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 %>% adorn_totals(where = "row", name = "合計", fill = "-", na.rm = T, "Value1")
sampledf_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 -
$Value2 %>% class() sampledf_value1
[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
以上です。