データフレームに列や行の合計を追記する方法

データフレームに列や行の合計を追記する関数 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 としています。

始めに列の合計を追加します。引数 whererow に指定します。また、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

合計は算出されません。

続いて行の合計を追加します。引数 wherecol に指定します。

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

右端にクラスが数値のセルの合計が行ごとに追記されています。

rowcol を続けますと列と行の合計が追記されたデータフレームを作成できます。その場合、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_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

以上です。