データフレーム(文字列)の頻度を可視化したい 〜エラーバーを添えて〜 with dplyr, ggplot2

の続きみたいなもん。

前回の記事では

> sample(letters[1:15], 100, replace=TRUE)
  [1] "j" "n" "a" "n" "a" "l" "l" "h" "d" "o" "l" "l" "c" "f" "m" "g" "c" "j" "h" "m" "a" "d" "m" "c"
 [25] "g" "h" "c" "h" "d" "d" "l" "m" "l" "b" "i" "e" "d" "g" "f" "h" "c" "j" "i" "a" "m" "f" "n" "f"
 [49] "e" "e" "o" "f" "b" "b" "g" "m" "n" "h" "k" "g" "g" "b" "i" "d" "e" "n" "b" "h" "o" "a" "b" "m"
 [73] "n" "j" "b" "j" "h" "a" "h" "g" "k" "e" "f" "c" "c" "n" "e" "l" "k" "n" "i" "o" "f" "g" "o" "j"
 [97] "g" "c" "c" "f"

というデータの可視化を行ったが、今回はこれを

  • 複数回繰り返して(GROUP化するイメージ)
  • 各GROUP内での各文字の出現頻度を計算して
  • 各GROUP間での各文字の出現頻度の相対誤差を計算して
  • その結果を棒グラフ(出現頻度の平均) with エラーバー(相対誤差)で描画したい

という状況を考える。ややこしいですね。
サンプルデータを上に倣って適当に作ると

x <- data.frame(VALUE=sample(letters[1:15], 100, replace=TRUE), 
           GROUP=sample(1:10, 100, replace=TRUE))

な感じ。以下のようなデータになっている。

> head(x, 10)
   VALUE GROUP
1      l    10
2      d     2
3      f    10
4      m    10
5      h     3
6      d     3
7      d     1
8      i     1
9      l     3
10     a     6

好きな文字(A-O)を100個選んで、それを適当に10(GROUPのMAX値)個のグループに分けたデータということだ。

んで、上記の内容を一発でChain(%>%)するために以下のようなコードを書いた。
キモは

  • prop.tableでtableの結果を頻度に倒せる
  • geom_barの引数のstat="identity"は必須で、デフォルトでは"bin"になっており、これはデータのカウントに相当

としてる所だろうか。特にprop.tableは初めて知った。頻度出すのにはこれかー。
もっといいやり方はあると思うので、誰か頼む。

x %>% 
  group_by(GROUP) %>% 
  table %>% 
  prop.table(., 2) %>%
  data.frame %>%
  group_by(VALUE) %>% 
  summarize(MEAN=mean(Freq), SE=sd(Freq)/sqrt(n())) %>%
  ggplot(data=., aes(x=VALUE, y=MEAN)) +
  geom_bar(aes(fill=VALUE), stat="identity") + 
  geom_errorbar(aes(ymin=MEAN-SE, ymax=MEAN+SE), width=.5, size=2)

結果は↓、結構びゅーちふる。