今回もRの記事です。
tidyverseとRmisc
tidyverseはデータの可視化に優れたggplot2やパイプ演算子やグループ化、記述統計に便利なdplyrなどが詰まった「これひとつで何でも来いや」的な超便利パッケージです。
一方、ggplotを一度に表示したい場合に使うmultiplotの入ったこちらも優れたパッケージのRmisc。
どうやらこいつらの相性があまり良くないみたい、、
問題
一番わかりやすい問題はsummarize関数でしょうか。。
> library(tidyverse)
>
> iris %>%
+ group_by(Species) %>%
+ summarize(mean = mean(Sepal.Length),
+ .groups = "drop") #.groups = "drop"でグループを解除
# A tibble: 3 x 2
Species mean
<fct> <dbl>
1 setosa 5.01
2 versicolor 5.94
3 virginica 6.59
みんな大好きgroup化とsummarize関数(summariseでも構いません)ですが、通常はこう表示されるはず。。
しかしRmiscもインポートしてしまうと、、
> library(tidyverse)
> library(Rmisc)
>
> iris %>%
+ group_by(Species) %>%
+ summarize(mean = mean(Sepal.Length),
+ .groups = "drop")
mean .groups
1 5.843333 drop
meanが一つしかありません。全体の平均を出しているのでしょうか。
「.groups」も列名として認識されちゃってます。。(泣
なにかよくわからないことになってしまいました。
原因は、、
原因はライブラリのインポート後に表示されるこれ。
> library(tidyverse) #tidyverseのメッセージは省略
> library(Rmisc)
要求されたパッケージ lattice をロード中です
要求されたパッケージ plyr をロード中です
--------------------------------------------------------------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
--------------------------------------------------------------------------------------------------------------------------------------------
次のパッケージを付け加えます: ‘plyr’
以下のオブジェクトは ‘package:dplyr’ からマスクされています:
arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
以下のオブジェクトは ‘package:purrr’ からマスクされています:
compact
いかにも怪しげですね。
これはsummarize関数がRmiscの(plyr)の中にも同じ関数が入っていて、関数がぶつかっちゃって、上書きしますよーーーってことなんです。
なので、下のように読みこむパッケージの順番を逆にすると、plyr::summarize( )がdplyr::summarize( )によって上書きされ、うまくいくのです。(「::」については後述)
> library(Rmisc)
> library(tidyverse)
─ Attaching packages ─────────────────────────────────────────────────── tidyverse 1.3.0 ─
✓ ggplot2 3.3.2 ✓ purrr 0.3.4
✓ tibble 3.0.3 ✓ dplyr 1.0.0
✓ tidyr 1.1.0 ✓ stringr 1.4.0
✓ readr 1.3.1 ✓ forcats 0.5.0
─ Conflicts ──────────────────────────────────────────────────── tidyverse_conflicts() ─
x dplyr::arrange() masks plyr::arrange()
x purrr::compact() masks plyr::compact()
x dplyr::count() masks plyr::count()
x dplyr::failwith() masks plyr::failwith()
x dplyr::filter() masks stats::filter()
x dplyr::id() masks plyr::id()
x dplyr::lag() masks stats::lag()
x dplyr::mutate() masks plyr::mutate()
x dplyr::rename() masks plyr::rename()
x dplyr::summarise() masks plyr::summarise()
x dplyr::summarize() masks plyr::summarize()
>
> iris %>%
+ group_by(Species) %>%
+ summarize(mean = mean(Sepal.Length),
+ .groups = "drop")
# A tibble: 3 x 2
Species mean
<fct> <dbl>
1 setosa 5.01
2 versicolor 5.94
3 virginica 6.59
ややこしいですよね。
メッセージによると、arrange関数やmutate関数などよく使う関数でも衝突が起こっています。関数の使用が同じなら、問題なく使えるのですが、summarize関数のようなことが起こると、、、
# 解決策
二つのライブラリを同時読み込んでしまうとエラーメッセージのようなものがたくさん表示されてしまいますし、わざわざ順番を考えるのもめんどくさい!!ので、「::」を使いましょう。
「::」は、パッケージ名を指定して、関数を呼び出します。例えば、
> dplyr::summarize()
このようにして使います。これを利用すれば、使いたいパッケージの使いたい関数を呼び出せるので問題なさそうですね。
install.packages( )でインストールさえしてあれば、library( )で呼び出していなくても使えます。
そのため、僕みたいに**「Rmiscはmultiplotしか使わないよ!」**なんて方は
> #library(Rmisc) は使わずに
> Rmisc::multiplot(g1, g2)
で十分じゃないでしょうか。
まとめ
僕がつまずいたのはtidyverseとRmiscでしたが、パッケージは無限にあるので、他のパッケージ間でも同様のことが起こるかもしれません。
Rstudioの入力補完では、使おうとしている関数がどのパッケージのものなのか、わかるようになっています。
上の画像ではsummarizeの横に{dplyr}と書かれているので、dplyrから呼び出された関数が使われようとしています。
パッケージや関数を呼び出すときには十分注意して使いましょう!!
では〜〜 ^ - ^