ぼやかないつもりのメモ(ブログ Ver)

つぶやきとメモの記録。更新はぼちぼち。

()が好きすぎて、羽鳥教徒になれない私

id:teramonagiさんの「クロス集計 in R : dplyr + tidyr=(xtabs|table)」を読んでいて、改めて、自分はパイプ系が苦手だと思い知った。結局、xtabs()関数やtable()関数の使い方の方がしっくりきてしまったのだ。せっかくなので理由も少し考えてみた。
まず以前、中澤先生が書かれていたけど、僕もパイプ系のコードの有用さがいまいちピンときていない*1。その上、パイプ系のコードを眺めていると、単純に新しい言語を勉強し直している気になってしまう。また、依存するパッケージが増えたときに、パッケージの仕様変更に引きずられて、使えなくなるコードが出てくることも結構恐れている*2。特に、自分が教えているプログラミング自体に馴染みの薄い人たちが、万が一、仕様変更で教えたコードが使えなくなってしまったとき、自分で調べて何とかするなんてことはまだちょっと期待できない。最後に実は()が好きなのではないかという点も挙げられる(笑)。Rよりもずっと()が出てくるxyzzylisp系)をエディタとして使っているのも、それが理由なんじゃないかと思えてきた。
ついでにid:teramonagiさんのコードを借りて、ちょっと調べ物もしてみた。と言ってもclass()とsummary()をかけただけだけど、いちいちオブジェクトに突っ込んで、それを表示させるために()を多めに用いています(笑)。

# 以下のコードはほとんどid:teramonagiさんによるものです。
# クロス集計 in R : dplyr + tidyr=(xtabs|table):http://d.hatena.ne.jp/teramonagi/20150312/1426109245
library(dplyr)
library(tidyr)
df <- as.data.frame(UCBAdmissions)
head(df)
(a1 <- xtabs(~ Gender + Admit, df))
(d1 <- df %>% xtabs(~ Gender + Admit, .))
(d2 <- df %>% group_by(Gender, Admit) %>% tally %>% spread(Admit, n))
class(a1)
class(d2)
# 違いはsummary()をかけるとよくわかる。ちなみに、d2はchisq.test()不可
summary(a1)
summary(d2)
(a2 <- xtabs(Freq ~ Gender + Admit, df))
(d3 <- df %>% xtabs(Freq ~ Gender + Admit, .))
(d4 <-  df %>% group_by(Gender, Admit) %>% summarize(n=sum(Freq)) %>% spread(Admit, n))
class(a2)
class(d4)
summary(a2)
summary(d4)
(b <- factor(rep(LETTERS[1:3], 10)))
(d <- factor(rep(LETTERS[1:3], 10), levels = LETTERS[1:5]))
(a3 <- table(b, d))
df.a <- data.frame(b, d)
(d5 <- df.a %>% group_by(b, d) %>% tally %>% spread(b, n))
class(a3)
class(d5)
summary(a3)
summary(d5)

びっくりしたのは、tableクラスのオブジェクトにsummary()をかけると、かってに独立性の検定をやってくれること。やっぱりRは奥が深い。

> class(a1)
[1] "xtabs" "table"
> class(d2)
[1] "tbl_df"     "tbl"        "data.frame"
> # 違いはsummary()をかけるとよくわかる。ちなみに、d2はchisq.test()不可
> summary(a1)
Call: xtabs(formula = ~Gender + Admit, data = df)
Number of cases in table: 24 
Number of factors: 2 
Test for independence of all factors:
        Chisq = 0, df = 1, p-value = 1
> summary(d2)
    Gender     Admitted    Rejected
 Male  :1   Min.   :6   Min.   :6  
 Female:1   1st Qu.:6   1st Qu.:6  
            Median :6   Median :6  
            Mean   :6   Mean   :6  
            3rd Qu.:6   3rd Qu.:6  
            Max.   :6   Max.   :6  

*1:一瞬はまりかけたggplot2に、もう少し傾倒していれば、少し変わっていたかもしれないけど、ggplot2に最初惹かれた一番の理由は、単に自分のリサーチ不足でうまく図を描くことが今よりもずっと下手だったからだと思う。

*2:以前dyplrでも大きな仕様変更があったような気がする。そのときは互換性は保ってもらえたんだっけか?