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