はじめに
前回に引き続き、dplyrの新機能を紹介していきます。
本記事では、列の操作についてまとめたいと思います。
前回の記事はこちら
dplyr Version 1.0.0 新機能 1: https://qiita.com/shunido113/items/fd312700f2ede2235b71
※本記事では、dplyr Version 1.0.0を新バージョン、dplyr Version 1.0.0より前のdplyrを旧バージョンとしています。
参考サイト
本家の公式サイトです。
英語ができるならこちらのほうがいいかもです笑
インストール
まずは、tidyverseを以下のコードでインストールしましょう。
※tidyverseは、データ処理を簡単にしてくれるパッケージ群の総称でその中の一つがdplyrです。
install.packages("tidyverse")
library(tidyverse)
データ
本記事で使用するデータは、前回に引き続き、diamondsです。
diamonds
# A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63
5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48
7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47
8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53
9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49
10 0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39
# ... with 53,930 more rows
across
acrossは、新バージョンの新しい関数です!
これは、列に対して、同じ処理を実施するときに便利です。
まずは、よく使用するsummarizeに対してacrossを使用した場合をどうぞ!。
summarize
旧バージョンでは、違う列に同じ処理を実施する際、いちいち列ごとに処理を記載する必要がありました。
# depth, table, priceの平均
diamonds %>%
group_by(color) %>%
summarise(depth = mean(depth), table = mean(table), price = mean(price))
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 7 x 4
color depth table price
<ord> <dbl> <dbl> <dbl>
1 D 61.7 57.4 3170.
2 E 61.7 57.5 3077.
3 F 61.7 57.4 3725.
4 G 61.8 57.3 3999.
5 H 61.8 57.5 4487.
6 I 61.8 57.6 5092.
7 J 61.9 57.8 5324.
新バージョンでは、acrossを使用して、こんな感じで書けます!
acrossの第一引数で列を指定し、第二引数で処理内容を記述します。
# depth, table, priceの平均
diamonds %>%
group_by(color) %>%
summarise(across(depth:price, mean))
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 7 x 4
color depth table price
<ord> <dbl> <dbl> <dbl>
1 D 61.7 57.4 3170.
2 E 61.7 57.5 3077.
3 F 61.7 57.4 3725.
4 G 61.8 57.3 3999.
5 H 61.8 57.5 4487.
6 I 61.8 57.6 5092.
7 J 61.9 57.8 5324.
acrossの第一引数は、selectと同じ要領で列を選択できます。
# numeric型の平均
diamonds %>%
group_by(color) %>%
summarise(across(where(is.numeric), mean))
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 7 x 8
color carat depth table price x y z
<ord> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 D 0.658 61.7 57.4 3170. 5.42 5.42 3.34
2 E 0.658 61.7 57.5 3077. 5.41 5.42 3.34
3 F 0.737 61.7 57.4 3725. 5.61 5.62 3.46
4 G 0.771 61.8 57.3 3999. 5.68 5.68 3.51
5 H 0.912 61.8 57.5 4487. 5.98 5.98 3.70
6 I 1.03 61.8 57.6 5092. 6.22 6.22 3.85
7 J 1.16 61.9 57.8 5324. 6.52 6.52 4.03
acrossの第二引数は、Rのbase関数だけでなく、自分で処理内容を書くことも可能です。
# ~の後に処理内容を記載。.xは、指定した列を表している。
# numeric型の平均を標準偏差で割った値
diamonds %>%
group_by(color) %>%
summarise(across(where(is.numeric),
~ mean(.x) / sd(.x) )
)
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 7 x 8
color carat depth table price x y z
<ord> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 D 1.83 43.7 26.0 0.944 5.77 5.79 5.78
2 E 1.78 42.7 25.6 0.920 5.63 5.46 5.07
3 F 1.85 42.9 25.4 0.984 5.57 5.62 5.54
4 G 1.75 45.1 26.7 0.987 5.24 5.28 5.20
5 H 1.75 42.8 25.7 1.06 5.00 4.54 4.97
6 I 1.77 42.4 25.0 1.08 4.96 5.00 4.99
7 J 1.95 39.9 25.0 1.20 5.42 5.45 5.44
処理内容を外だしにすることもできます。
mean_sd <- list(
mean = ~mean(.x, na.rm = TRUE),
sd = ~sd(.x, na.rm = TRUE)
)
# numeric型の平均と標準偏差
diamonds %>%
group_by(color) %>%
summarize(across(where(is.numeric), mean_sd))
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 7 x 15
color carat_mean carat_sd depth_mean depth_sd table_mean table_sd price_mean price_sd x_mean x_sd y_mean y_sd z_mean z_sd
<ord> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 D 0.658 0.360 61.7 1.41 57.4 2.21 3170. 3357. 5.42 0.939 5.42 0.936 3.34 0.579
2 E 0.658 0.369 61.7 1.44 57.5 2.24 3077. 3344. 5.41 0.961 5.42 0.993 3.34 0.659
3 F 0.737 0.398 61.7 1.44 57.4 2.26 3725. 3785. 5.61 1.01 5.62 0.999 3.46 0.626
4 G 0.771 0.441 61.8 1.37 57.3 2.15 3999. 4051. 5.68 1.08 5.68 1.08 3.51 0.674
5 H 0.912 0.521 61.8 1.44 57.5 2.24 4487. 4216. 5.98 1.20 5.98 1.32 3.70 0.744
6 I 1.03 0.579 61.8 1.46 57.6 2.30 5092. 4722. 6.22 1.25 6.22 1.24 3.85 0.770
7 J 1.16 0.596 61.9 1.55 57.8 2.31 5324. 4438. 6.52 1.20 6.52 1.20 4.03 0.741
acrossの第三引数で列名を指定することもできます。
mean_sd <- list(
mean = ~mean(.x, na.rm = TRUE),
sd = ~sd(.x, na.rm = TRUE)
)
# numeric型の平均と標準偏差
# {fn}が関数名、{col}が指定した列名
diamonds %>%
group_by(color) %>%
summarize(across(where(is.numeric), mean_sd, .names = "{fn}.{col}"))
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 7 x 15
color mean.carat sd.carat mean.depth sd.depth mean.table sd.table mean.price sd.price mean.x sd.x mean.y sd.y mean.z sd.z
<ord> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 D 0.658 0.360 61.7 1.41 57.4 2.21 3170. 3357. 5.42 0.939 5.42 0.936 3.34 0.579
2 E 0.658 0.369 61.7 1.44 57.5 2.24 3077. 3344. 5.41 0.961 5.42 0.993 3.34 0.659
3 F 0.737 0.398 61.7 1.44 57.4 2.26 3725. 3785. 5.61 1.01 5.62 0.999 3.46 0.626
4 G 0.771 0.441 61.8 1.37 57.3 2.15 3999. 4051. 5.68 1.08 5.68 1.08 3.51 0.674
5 H 0.912 0.521 61.8 1.44 57.5 2.24 4487. 4216. 5.98 1.20 5.98 1.32 3.70 0.744
6 I 1.03 0.579 61.8 1.46 57.6 2.30 5092. 4722. 6.22 1.25 6.22 1.24 3.85 0.770
7 J 1.16 0.596 61.9 1.55 57.8 2.31 5324. 4438. 6.52 1.20 6.52 1.20 4.03 0.741
summarize以外
今まではsummarizeに対するacrossを取り扱ってきましたが、acrossは他の関数でも使用できます。
#ordered型の組み合わせ
diamonds %>%
distinct(across(where(is.ordered)))
# A tibble: 276 x 3
cut color clarity
<ord> <ord> <ord>
1 Ideal E SI2
2 Premium E SI1
3 Good E VS1
4 Premium I VS2
5 Good J SI2
6 Very Good J VVS2
7 Very Good I VVS1
8 Very Good H SI1
9 Fair E VS2
10 Very Good H VS1
# ... with 266 more rows
#ordered型の組み合わせの個数 降順にソート
diamonds %>%
count(across(where(is.ordered)), sort = T)
# A tibble: 276 x 4
cut color clarity n
<ord> <ord> <ord> <int>
1 Ideal E VS2 1136
2 Ideal G VS1 953
3 Ideal D VS2 920
4 Ideal G VS2 910
5 Ideal F VS2 879
6 Ideal G VVS2 774
7 Ideal E SI1 766
8 Ideal H SI1 763
9 Ideal D SI1 738
10 Premium G VS2 721
# ... with 266 more rows
_if, _at, _allについて
旧バージョンでも、_if, _at, _allを使用することで複数の列に関数を適用することができました。
# numeric型を正規化
diamonds %>%
mutate_if(
is.numeric,
~ (.x - mean(.x)) / sd(.x)
)
# A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -1.20 Ideal E SI2 -0.174 -1.10 -0.904 -1.59 -1.54 -1.57
2 -1.24 Premium E SI1 -1.36 1.59 -0.904 -1.64 -1.66 -1.74
3 -1.20 Good E VS1 -3.38 3.38 -0.904 -1.50 -1.46 -1.74
4 -1.07 Premium I VS2 0.454 0.243 -0.902 -1.36 -1.32 -1.29
5 -1.03 Good J SI2 1.08 0.243 -0.902 -1.24 -1.21 -1.12
6 -1.18 Very Good J VVS2 0.733 -0.205 -0.902 -1.60 -1.55 -1.50
7 -1.18 Very Good I VVS1 0.384 -0.205 -0.902 -1.59 -1.54 -1.51
8 -1.13 Very Good H SI1 0.105 -1.10 -0.901 -1.48 -1.42 -1.43
9 -1.22 Fair E VS2 2.34 1.59 -0.901 -1.66 -1.71 -1.49
10 -1.20 Very Good H VS1 -1.64 1.59 -0.901 -1.54 -1.47 -1.63
# ... with 53,930 more rows
# 列名にeが含まれている列を正規化
diamonds %>%
mutate_at(
vars(contains("e")),
~ (.x - mean(.x)) / sd(.x)
)
# A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0.23 Ideal E SI2 -0.174 -1.10 -0.904 3.95 3.98 2.43
2 0.21 Premium E SI1 -1.36 1.59 -0.904 3.89 3.84 2.31
3 0.23 Good E VS1 -3.38 3.38 -0.904 4.05 4.07 2.31
4 0.290 Premium I VS2 0.454 0.243 -0.902 4.2 4.23 2.63
5 0.31 Good J SI2 1.08 0.243 -0.902 4.34 4.35 2.75
6 0.24 Very Good J VVS2 0.733 -0.205 -0.902 3.94 3.96 2.48
7 0.24 Very Good I VVS1 0.384 -0.205 -0.902 3.95 3.98 2.47
8 0.26 Very Good H SI1 0.105 -1.10 -0.901 4.07 4.11 2.53
9 0.22 Fair E VS2 2.34 1.59 -0.901 3.87 3.78 2.49
10 0.23 Very Good H VS1 -1.64 1.59 -0.901 4 4.05 2.39
# ... with 53,930 more rows
# すべての列を正規化
diamonds %>%
select(where(is.numeric)) %>%
mutate_all(
~ (.x - mean(.x)) / sd(.x)
)
# A tibble: 53,940 x 7
carat depth table price x y z
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -1.20 -0.174 -1.10 -0.904 -1.59 -1.54 -1.57
2 -1.24 -1.36 1.59 -0.904 -1.64 -1.66 -1.74
3 -1.20 -3.38 3.38 -0.904 -1.50 -1.46 -1.74
4 -1.07 0.454 0.243 -0.902 -1.36 -1.32 -1.29
5 -1.03 1.08 0.243 -0.902 -1.24 -1.21 -1.12
6 -1.18 0.733 -0.205 -0.902 -1.60 -1.55 -1.50
7 -1.18 0.384 -0.205 -0.902 -1.59 -1.54 -1.51
8 -1.13 0.105 -1.10 -0.901 -1.48 -1.42 -1.43
9 -1.22 2.34 1.59 -0.901 -1.66 -1.71 -1.49
10 -1.20 -1.64 1.59 -0.901 -1.54 -1.47 -1.63
# ... with 53,930 more rows
新バージョンではacrossを使用することで、これらを以下のように修正できます。
一つの書き方を覚えればいいので、こちらのほうが便利ですね!
# numeric型を正規化
diamonds %>%
mutate(
across(where(is.numeric),
~ (.x - mean(.x)) / sd(.x)
)
)
# A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -1.20 Ideal E SI2 -0.174 -1.10 -0.904 -1.59 -1.54 -1.57
2 -1.24 Premium E SI1 -1.36 1.59 -0.904 -1.64 -1.66 -1.74
3 -1.20 Good E VS1 -3.38 3.38 -0.904 -1.50 -1.46 -1.74
4 -1.07 Premium I VS2 0.454 0.243 -0.902 -1.36 -1.32 -1.29
5 -1.03 Good J SI2 1.08 0.243 -0.902 -1.24 -1.21 -1.12
6 -1.18 Very Good J VVS2 0.733 -0.205 -0.902 -1.60 -1.55 -1.50
7 -1.18 Very Good I VVS1 0.384 -0.205 -0.902 -1.59 -1.54 -1.51
8 -1.13 Very Good H SI1 0.105 -1.10 -0.901 -1.48 -1.42 -1.43
9 -1.22 Fair E VS2 2.34 1.59 -0.901 -1.66 -1.71 -1.49
10 -1.20 Very Good H VS1 -1.64 1.59 -0.901 -1.54 -1.47 -1.63
# ... with 53,930 more rows
# 列名にeが含まれている列を正規化
diamonds %>%
mutate(
across(contains("e"),
~ (.x - mean(.x)) / sd(.x)
)
)
# A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0.23 Ideal E SI2 -0.174 -1.10 -0.904 3.95 3.98 2.43
2 0.21 Premium E SI1 -1.36 1.59 -0.904 3.89 3.84 2.31
3 0.23 Good E VS1 -3.38 3.38 -0.904 4.05 4.07 2.31
4 0.290 Premium I VS2 0.454 0.243 -0.902 4.2 4.23 2.63
5 0.31 Good J SI2 1.08 0.243 -0.902 4.34 4.35 2.75
6 0.24 Very Good J VVS2 0.733 -0.205 -0.902 3.94 3.96 2.48
7 0.24 Very Good I VVS1 0.384 -0.205 -0.902 3.95 3.98 2.47
8 0.26 Very Good H SI1 0.105 -1.10 -0.901 4.07 4.11 2.53
9 0.22 Fair E VS2 2.34 1.59 -0.901 3.87 3.78 2.49
10 0.23 Very Good H VS1 -1.64 1.59 -0.901 4 4.05 2.39
# ... with 53,930 more rows
# すべての列を正規化
diamonds %>%
select(where(is.numeric)) %>%
mutate(
across(everything(),
~ (.x - mean(.x)) / sd(.x)
)
)
# A tibble: 53,940 x 7
carat depth table price x y z
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -1.20 -0.174 -1.10 -0.904 -1.59 -1.54 -1.57
2 -1.24 -1.36 1.59 -0.904 -1.64 -1.66 -1.74
3 -1.20 -3.38 3.38 -0.904 -1.50 -1.46 -1.74
4 -1.07 0.454 0.243 -0.902 -1.36 -1.32 -1.29
5 -1.03 1.08 0.243 -0.902 -1.24 -1.21 -1.12
6 -1.18 0.733 -0.205 -0.902 -1.60 -1.55 -1.50
7 -1.18 0.384 -0.205 -0.902 -1.59 -1.54 -1.51
8 -1.13 0.105 -1.10 -0.901 -1.48 -1.42 -1.43
9 -1.22 2.34 1.59 -0.901 -1.66 -1.71 -1.49
10 -1.20 -1.64 1.59 -0.901 -1.54 -1.47 -1.63
# ... with 53,930 more rows
まとめ
旧バージョンと比較して、列操作が柔軟になりました!
ぜひとも使いこなしたいですね!
SESSION INFORMATION
devtools::session_info()
- Session info --------------------------------------------------------------------------------------------------------------------
setting value
version R version 3.6.3 (2020-02-29)
os Windows >= 8 x64
system x86_64, mingw32
ui RStudio
language (EN)
collate Japanese_Japan.932
ctype Japanese_Japan.932
tz Asia/Tokyo
date 2020-06-17
- Packages ------------------------------------------------------------------------------------------------------------------------
package * version date lib source
assertthat 0.2.1 2019-03-21 [1] CRAN (R 3.6.3)
backports 1.1.7 2020-05-13 [1] CRAN (R 3.6.3)
blob 1.2.1 2020-01-20 [1] CRAN (R 3.6.3)
broom 0.5.6 2020-04-20 [1] CRAN (R 3.6.3)
callr 3.4.3 2020-03-28 [1] CRAN (R 3.6.3)
cellranger 1.1.0 2016-07-27 [1] CRAN (R 3.6.3)
cli 2.0.2 2020-02-28 [1] CRAN (R 3.6.3)
colorspace 1.4-1 2019-03-18 [1] CRAN (R 3.6.3)
crayon 1.3.4 2017-09-16 [1] CRAN (R 3.6.3)
DBI 1.1.0 2019-12-15 [1] CRAN (R 3.6.3)
dbplyr 1.4.4 2020-05-27 [1] CRAN (R 3.6.3)
desc 1.2.0 2018-05-01 [1] CRAN (R 3.6.3)
devtools 2.3.0 2020-04-10 [1] CRAN (R 3.6.3)
digest 0.6.25 2020-02-23 [1] CRAN (R 3.6.3)
dplyr * 1.0.0 2020-05-29 [1] CRAN (R 3.6.3)
ellipsis 0.3.1 2020-05-15 [1] CRAN (R 3.6.3)
evaluate 0.14 2019-05-28 [1] CRAN (R 3.6.3)
fansi 0.4.1 2020-01-08 [1] CRAN (R 3.6.3)
forcats * 0.5.0 2020-03-01 [1] CRAN (R 3.6.3)
fs 1.4.1 2020-04-04 [1] CRAN (R 3.6.3)
generics 0.0.2 2018-11-29 [1] CRAN (R 3.6.3)
ggplot2 * 3.3.1 2020-05-28 [1] CRAN (R 3.6.3)
glue 1.4.1 2020-05-13 [1] CRAN (R 3.6.3)
gtable 0.3.0 2019-03-25 [1] CRAN (R 3.6.3)
haven 2.3.1 2020-06-01 [1] CRAN (R 3.6.3)
hms 0.5.3 2020-01-08 [1] CRAN (R 3.6.3)
htmltools 0.4.0 2019-10-04 [1] CRAN (R 3.6.3)
httr 1.4.1 2019-08-05 [1] CRAN (R 3.6.3)
jsonlite 1.6.1 2020-02-02 [1] CRAN (R 3.6.3)
knitr 1.28 2020-02-06 [1] CRAN (R 3.6.3)
lattice 0.20-38 2018-11-04 [2] CRAN (R 3.6.3)
lifecycle 0.2.0 2020-03-06 [1] CRAN (R 3.6.3)
lubridate 1.7.9 2020-06-08 [1] CRAN (R 3.6.3)
magrittr 1.5 2014-11-22 [1] CRAN (R 3.6.3)
memoise 1.1.0 2017-04-21 [1] CRAN (R 3.6.3)
modelr 0.1.8 2020-05-19 [1] CRAN (R 3.6.3)
munsell 0.5.0 2018-06-12 [1] CRAN (R 3.6.3)
nlme 3.1-144 2020-02-06 [2] CRAN (R 3.6.3)
pillar 1.4.4 2020-05-05 [1] CRAN (R 3.6.3)
pkgbuild 1.0.8 2020-05-07 [1] CRAN (R 3.6.3)
pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 3.6.3)
pkgload 1.1.0 2020-05-29 [1] CRAN (R 3.6.3)
prettyunits 1.1.1 2020-01-24 [1] CRAN (R 3.6.3)
processx 3.4.2 2020-02-09 [1] CRAN (R 3.6.3)
ps 1.3.3 2020-05-08 [1] CRAN (R 3.6.3)
purrr * 0.3.4 2020-04-17 [1] CRAN (R 3.6.3)
R6 2.4.1 2019-11-12 [1] CRAN (R 3.6.3)
Rcpp 1.0.4.6 2020-04-09 [1] CRAN (R 3.6.3)
readr * 1.3.1 2018-12-21 [1] CRAN (R 3.6.3)
readxl 1.3.1 2019-03-13 [1] CRAN (R 3.6.3)
remotes 2.1.1 2020-02-15 [1] CRAN (R 3.6.3)
renv 0.10.0 2020-05-06 [1] CRAN (R 3.6.3)
reprex 0.3.0 2019-05-16 [1] CRAN (R 3.6.3)
rlang 0.4.6 2020-05-02 [1] CRAN (R 3.6.3)
rmarkdown 2.1 2020-01-20 [1] CRAN (R 3.6.3)
rprojroot 1.3-2 2018-01-03 [1] CRAN (R 3.6.3)
rstudioapi 0.11 2020-02-07 [1] CRAN (R 3.6.3)
rvest 0.3.5 2019-11-08 [1] CRAN (R 3.6.3)
scales 1.1.1 2020-05-11 [1] CRAN (R 3.6.3)
sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 3.6.3)
stringi 1.4.6 2020-02-17 [1] CRAN (R 3.6.2)
stringr * 1.4.0 2019-02-10 [1] CRAN (R 3.6.3)
testthat 2.3.2 2020-03-02 [1] CRAN (R 3.6.3)
tibble * 3.0.1 2020-04-20 [1] CRAN (R 3.6.3)
tidyr * 1.1.0 2020-05-20 [1] CRAN (R 3.6.3)
tidyselect 1.1.0 2020-05-11 [1] CRAN (R 3.6.3)
tidyverse * 1.3.0 2019-11-21 [1] CRAN (R 3.6.3)
usethis 1.6.1 2020-04-29 [1] CRAN (R 3.6.3)
utf8 1.1.4 2018-05-24 [1] CRAN (R 3.6.3)
vctrs 0.3.1 2020-06-05 [1] CRAN (R 3.6.3)
withr 2.2.0 2020-04-20 [1] CRAN (R 3.6.3)
xfun 0.13 2020-04-13 [1] CRAN (R 3.6.3)
xml2 1.3.2 2020-04-23 [1] CRAN (R 3.6.3)
yaml 2.2.1 2020-02-01 [1] CRAN (R 3.6.3)