SNAGeek

Sociologically Technological, and Technologically Sociological

ggplot2で多重クロス表を作る

  • 最近は大学院の研究でひたすら3重クロス表の分析を行っています。
  • Rでは xtable パッケージの xtable() を使うと2重クロス表をTeX形式で出力してくれるのですが、3重以上の多重クロス表には対応していません。
    • gridExtra::grid.table() を使う方法もあるかと思いますが、余白の扱いや多重の場合が少し面倒な印象があります。
  • そこで今回は、ggplot2を使った多重クロス表の出力方法を紹介します

セッション情報

  • 毎度のことながらrstudio cloud上で動かしています。
> sessionInfo()
R version 3.5.3 (2019-03-11)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.6 LTS

Matrix products: default
BLAS: /usr/lib/atlas-base/atlas/libblas.so.3.0
LAPACK: /usr/lib/atlas-base/atlas/liblapack.so.3.0

locale:
 [1] LC_CTYPE=C.UTF-8       LC_NUMERIC=C           LC_TIME=C.UTF-8        LC_COLLATE=C.UTF-8     LC_MONETARY=C.UTF-8    LC_MESSAGES=C.UTF-8   
 [7] LC_PAPER=C.UTF-8       LC_NAME=C              LC_ADDRESS=C           LC_TELEPHONE=C         LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C   

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

下準備

{MASS} パッケージ内の Cars93 データを用います。

library(tidyverse)
data <- MASS::Cars93

まずは普通に出力

  • 車種(Type)、駆動系(DriveTrain)、生産国(Origin)の3重クロス表を作成します。
crosstab <- data %>% select(Type,DriveTrain,Origin) %>% table
> crosstab
, , Origin = USA

         DriveTrain
Type      4WD Front Rear
  Compact   0     7    0
  Large     0     7    4
  Midsize   0     9    1
  Small     0     7    0
  Sporty    2     2    4
  Van       3     2    0

, , Origin = non-USA

         DriveTrain
Type      4WD Front Rear
  Compact   1     6    2
  Large     0     0    0
  Midsize   0     8    4
  Small     2    12    0
  Sporty    0     5    1
  Van       2     2    0

geom_tileを使ってplotする

  • 何はともあれtidyに。
tidy_crosstab <- as.data.frame.table(crosstab)
> tidy_crosstab
      Type DriveTrain  Origin Freq
1  Compact        4WD     USA    0
2    Large        4WD     USA    0
3  Midsize        4WD     USA    0
4    Small        4WD     USA    0
5   Sporty        4WD     USA    2
6      Van        4WD     USA    3
7  Compact      Front     USA    7
8    Large      Front     USA    7
9  Midsize      Front     USA    9
10   Small      Front     USA    7
11  Sporty      Front     USA    2
12     Van      Front     USA    2
13 Compact       Rear     USA    0
14   Large       Rear     USA    4
15 Midsize       Rear     USA    1
16   Small       Rear     USA    0
17  Sporty       Rear     USA    4
18     Van       Rear     USA    0
19 Compact        4WD non-USA    1
20   Large        4WD non-USA    0
21 Midsize        4WD non-USA    0
22   Small        4WD non-USA    2
23  Sporty        4WD non-USA    0
24     Van        4WD non-USA    2
25 Compact      Front non-USA    6
26   Large      Front non-USA    0
27 Midsize      Front non-USA    8
28   Small      Front non-USA   12
29  Sporty      Front non-USA    5
30     Van      Front non-USA    2
31 Compact       Rear non-USA    2
32   Large       Rear non-USA    0
33 Midsize       Rear non-USA    4
34   Small       Rear non-USA    0
35  Sporty       Rear non-USA    1
36     Van       Rear non-USA    0
  • ggplotにつっこむ。
g <- ggplot(data = tidy_crosstab, aes(x = Type, y = DriveTrain, label = Freq))
g <- g + geom_tile(fill = "white",col = "black")
g <- g + geom_text()
g <- g + facet_wrap(~Origin, nrow = 1)
  • 出力されるのはこんな感じの画像になります。

f:id:meana0:20200310220153p:plain

4重クロス表

  • AirBagという変数を増やした4重クロス表を出力します
  • 今度は、facet_grid() を使います。
crosstab2 <- data %>% select(Type,DriveTrain,AirBags,Origin) %>% table
tidy_crosstab2 <- as.data.frame.table(crosstab2)
g <- ggplot(data = tidy_crosstab2, aes(x = Type, y = DriveTrain, label = Freq))
g <- g + geom_tile(fill = "white",col = "black")
g <- g + geom_text()
g <- g + facet_grid(Origin ~ AirBags)

f:id:meana0:20200310222149p:plain