gigi_QuestionsDesigner
@gigi_QuestionsDesigner (GiGi)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Rでクラスター分析をggplotでグラフ化するときにfacet_grid(.~変数)でエラー

解決したいこと

Rでクラスター分析(非階層のkmeansをkmeansコマンドとykmeansパッケージを使って)を行なっており、分析結果をggplot2のggplot で、商品カテゴリ別に、各クラスターごとの購入率を棒グラフ化してクラスターの特徴を理解しようとしています。

その際、facet_grid(.~ 商品カテゴリ) の部分でエラーが起きてしまい、下記のように自分なりに調べて対処しても解決しなかったため、ぜひ解決方法を教えてください!よろしくお願いします!(エラーが消えても、カテゴリーごとではなく、全体のクラスター別表示になってしまいます。)

※データセットやRのバージョンの情報は下記に記載しております。
※PCはMacです。

発生している問題・エラー

 `?`(., 商品カテゴリ) でエラー: 
  no documentation of type ‘.’ and topic ‘商品カテゴリ’ (or error in processing help)

※下記が分析対象のデータセットの情報と、Rのバージョン情報です。

> head(km_melt,15)
   km_cls 商品カテゴリ     購入率
1       1     キッチン 0.00000000
2       2     キッチン 0.03906250
3       3     キッチン 0.05000000
4       4     キッチン 0.07547170
5       5     キッチン 0.02777778
6       1   ベビー用品 0.02777778
7       2   ベビー用品 0.11718750
8       3   ベビー用品 0.00000000
9       4   ベビー用品 0.07547170
10      5   ベビー用品 0.16666667
11      1   マタニティ 0.00000000
12      2   マタニティ 0.08593750
13      3   マタニティ 0.00000000
14      4   マタニティ 0.03773585
15      5   マタニティ 0.05555556

> str(km_melt)
'data.frame':   90 obs. of  3 variables:
 $ km_cls      : Factor w/ 5 levels "1","2","3","4",..: 1 2 3 4 5 1 2 3 4 5 ...
 $ 商品カテゴリ: Factor w/ 18 levels "キッチン","ベビー用品",..: 1 1 1 1 1 2 2 2 2 2 ...
 $ 購入率      : num  0 0.0391 0.05 0.0755 0.0278 ...

> version
               _                           
platform       x86_64-apple-darwin17.0     
arch           x86_64                      
os             darwin17.0                  
system         x86_64, darwin17.0          
status                                     
major          4                           
minor          0.3                         
year           2020                        
month          10                          
day            10                          
svn rev        79318                       
language       R                           
version.string R version 4.0.3 (2020-10-10)
nickname       Bunny-Wunnies Freak Out  

該当するソースコード

library(gridExtra)
library(scales)
library(ggplot2)

g1 <- ggplot(km_melt, aes(
  x = km_cls,
  y = 購入率
))
g1 <- g1  + geom_bar(stat = "identity",
                     aes(fill = km_cls))
g1 <- g1 + facet_grid(.~ 商品カテゴリ)
g1 <- g1 + scale_y_continuous(labels = percent)

g2 <- ggplot(ykm_melt, aes(
  x = ykm_cls,
  y = 購入率
))
g2 <- g2 + geom_bar(stat = "identity",
                    aes(fill = ykm_cls))
g2 <- g2 + facet_grid(.~ 商品カテゴリ)
g2 <- g2 + scale_y_continuous(labels = percent)

grid.arrange(g1, g2, ncol = 1)

自分で試したこと

2箇所の facet_grid(.~ 商品カテゴリ) がエラー対象であり、
このコマンド(facet)を取り除くと、(やりたかったカテゴリー別の数値ごとの棒グラフが実現しないのですが)エラーが消えるので、おそらく対処すべきはfacet_grid(.~ 商品カテゴリ)という認識で、下記に取り組みましたが、問題は解決できませんでした。

1) facet_wrapに切り替える
(→エラーはなくなりましたが、やりたかったカテゴリー別の数値ごとの棒グラフが実現しない)
2) .に、試しに目的変数を入れている。
(→解決せず)
3) 商品カテゴリ"商品カテゴリ"にしてみる
(→解決せず)

どうぞよろしくお願いします!

0

2Answer

当方Windowsですが、私の環境では特に問題なく描写できました。そのため、上記コード自体に誤りはないと思われます。
g1g2は同じことを繰り返していると思われますので、当方ではg1についてのみ検証しました。

そのため一般的なトラブルシューティングしか提示できませんが、多少でもご参考になれば幸いです。

1. パッケージをアップデートする

念の為、{ggplot}が最新版になっているかどうかを確認したほうが良いかもしれません。

update.packages()

また、時折必要なパッケージが呼び出されていないことがありますので、一応ですが再度呼び出しておくと良いでしょう。

library(gridExtra)
library(scales)
library(ggplot2)

2. 明示的に引数を指定する

特定の関数に何らかしらの問題があると考えられる場合、普段省略している引数の指定をあえて明示的に記しておくと無難です。

  facet_grid(rows = .~ 商品カテゴリ)

3. データフレームの$namesに注意する

ちょっとしたスペースや空白文字などがデータフレームのラベルに入っていることがあり、それが原因で正常に動作していない可能性があります。
よって、一度データフレームのラベルを入れ直すことも検討してみてください。

names(km_melt) <- c("km_cls", "商品カテゴリ", "購入率")

それに関連して、初歩的なことではありますがfacet_grid()の中で全角スペースを使用していないか等にも留意すべきかもしれません。

# 悪い例
  facet_grid(rows = .~ 商品カテゴリ)

# 良い例
  facet_grid(rows = .~ 商品カテゴリ)

4. ラベルに日本語を避ける

さらに問題が解決しない場合、データフレームのラベルに日本語を使うのを避けたほうがよいと考えられます。

names(km_melt) <- c("km_cls", "category", "rate")
g1 <- ggplot(km_melt, 
             aes(x = km_cls, y = rate)) + 
  geom_bar(stat = "identity",
           aes(fill = km_cls)) + 
  facet_grid(rows = .~ category) + 
  scale_y_continuous(labels = percent)

5. パッケージ自体を再導入する

ぱっと見で考えられる原因は上記ぐらいなので、上記を全て試しても上手くいかない場合は、remove.packages()を用いて一旦パッケージを削除してから再導入したほうが良いかもしれません。

もっとも、あくまで予想の範囲ですが、私の環境でご提示されたコードをコピペして問題なく動作したことに鑑みれば、どちらかというと3.や4.で示したようなデータセット側の問題に起因している気がします。

追記 1.

データセット側に問題があるか、RまたはRパッケージ側に問題があるか確かめる必要があると思います。
よって、①一旦オブジェクトを全部クリアにしてから(RStudioの右上にある箒のアイコンをクリック)、②以下のコードをコピペして走らせてみてください。

km_melt_2 <- data.frame(as.factor(c(1,2,3,4,5,1,2,3,4,5)), 
                        as.factor(c("キッチン","キッチン","キッチン","キッチン","キッチン","ベビー用品","ベビー用品","ベビー用品","ベビー用品","ベビー用品")),
                        c(0.00000000,0.03906250,0.05000000,0.07547170,0.02777778,0.02777778,0.11718750,0.00000000,0.07547170,0.16666667))
names(km_melt_2) <- c("km_cls", "category", "rate")
ggplot2::ggplot(km_melt_2, 
                ggplot2::aes(x = km_cls, y = rate)) + 
  ggplot2::geom_bar(stat = "identity",
                    ggplot2::aes(fill = km_cls)) + 
  ggplot2::facet_grid(rows = .~ category) + 
  ggplot2::scale_y_continuous(labels = scales::percent)

Rplot03.png

これで問題なく描写できた場合はデータセット側に、エラーが出てきた場合はやはりRやパッケージ側に問題がある可能性が高いです。

データセット側であれば、一旦データセットを再作成するのが無難です。
R側であれば、私の思いつく限りの可能性としては①オブジェクトが競合していた、②R自体に何かしら問題がある、の2つが考えられます。前者の場合は、一旦オブジェクトをリセットしたので、恐らく問題が解決していると思いますが、コードを見直して競合しそうなオブジェクトの名称があれば変更する必要があります。後者の場合、いよいよR本体を再インストールすることも一考すべきかもしれません。

1Like

Comments

  1. お忙しい中、早速丁寧にご対応ありがとうございます!ご指摘の点、早速対応してみます!!
  2. アドバイスいただいた1〜4をすべて試したのですが、''' `?`(., category) でエラー:
    no documentation of type ‘.’ and topic ‘category’ (or error in processing help)'''となってしまいます。。。なぜだろう。。。
  3. 検索してもご提示いただいたエラー例が見つからないので、手探りになりますが、少なくともデータセット側かRやパッケージ側のいずれかに問題があると考えられます。
    どちらに問題があるか推測するために、元コメントに追記1.を記載しましたので、原因を特定するためにご参考になれば幸いです。(返信コメントにコードを書いても見づらいと思うので、上に追記しました。)
  4. すごくわかりやすく、しかも体系的&網羅的なフロー別のアドバイスで原因が特定をシンプルにできるのでとても助かります!
    いただいたご指示とコードを実行したところ、問題なく表示されました!!ありがとうございます!
    なので、おっしゃる通りデータセットになにかの問題(どんな問題か全然わかりませんが。教材をダウンロードしてきてそのまま読み込んでしまうという怠慢のため、、、)があったのでしょうね。

    こういうことが起きたとき、
    ・データセット自体が原因でありえて、データセット自体をリフレッシュして単純化して入れ替えてみて実験する。
    ・それでもうまくいかない場合は、オブジェクトの競合などが問題であることもある
    という再現性の高い学びも得られました!
    改めてありがとうございました!

@zakkiiii さんのご回答で解決済みかと思いますが、自分も可能性を思いついたのでご参考まで。

facet_grid(. ~ 商品カテゴリ)

の部分ですが、

facet_grid(~ `商品カテゴリ`)

でも動きます。もしかしたらこちらで解決するかもしれません。

1Like

Comments

  1. おお!!ありがとうございます!
    試してみたのですが、エラーは出てしましました。。。
    ただ、別の問題解決には有効かもしれないので、似た問題が起きた時の解決策候補の幅が増えたのは、ものすごく助かります!!なるほど、こういう表記でもいけるんですね!
    ありがとうございました!!
  2. 解決に役立てなくてすみません。
    列名はバッククオートで囲んでも認識するので、空白が入った列名とかを使うときとかに便利です!
  3. とんでもないです!とても有意義で勉強になりました!今後ともよろしくお願い致します!

Your answer might help someone💌