R logo

カテゴリデータの集計表⇔データフレームの切り替え。

クロス集計表

例えば、

運動あり 運動なし
認知症あり 10 15
認知症なし 20 5

のようなデータの集計表を作る時。

基本は行列で作る。

行列(matrix)で作る場合

行列で作る場合は下記。

# クロス集計表を作る
x < matrix(c(10, 15, 20, 5), byrow=TRUE, ncol=2)
dimnames(x) < list(c("Yes", "No"), c("Yes", "No"))
names(dimnames(x)) < c("Dementia", "Exercise")
x
cross-tabulation table-1

データフレーム(data.frame)で作る場合

データフレームで作る場合は下記。

# クロス集計表を作る
y <- data.frame(c(10, 20), c(15, 5))
rownames(y) <- c("Yes", "No")
colnames(y) <- c("Yes", "No")
cross-tabulation table-3

割合を求める

上記集計表の各セルの割合を求める時は、

prop.table()

を使う。

  • 行の割合(1で指定)
  • 列の割合(2で指定)
  • 全体に対する割合(指定なし)

の3種類が算出できる。

# 行の割合
prop.table(x,1)

# 列の割合
prop.table(x,2)

# 全体の割合
prop.table(x)
cross-tabulation table-2

 

データフレーム(y)の場合は、全体の割合のみ算出可能。

# 全体の割合を出す
prop.table(y)
cross-tabulation table-4

パーセンテージ表示

パーセンテージ(%)で表示したい場合は、*100 をすればOK。

# 行の割合(%)
prop.table(x,1)*100

# 列の割合(%)
prop.table(x,2)*100

# 全体の割合(%)
prop.table(x)*100
cross-tabulation table-8

四捨五入

上記 "列の割合(%)" を小数点第1で四捨五入してみる。

使用する関数は

round()

関数。

# 列の割合(%): 小数点第1で四捨五入
round(prop.table(x,2)*100,1)
cross-tabulation table-9

いい感じだけれど、右列も ".0" のように小数点第1で揃えたい場合は、

format()

関数を追加する。

# 小数点第1で揃えたい
format(round(prop.table(x,2)*100,1), nsmall = 1)
cross-tabulation table-10

tidydata のデータフレームに展開する

集計表からデータフレームに展開する時は、

epitools::expand.table

を使うと便利。

# epitool のインストール
install.packages("epitools")
library(epitools)

この場合、行列からのデータフレーム展開が可能。

# xを展開
x <- epitools::expand.table(x)
cross-tabulation table-5

 

データフレーム(y)を同じ方法で展開しようとしても、

# y を展開
y <- epitools::expand.table(y)

こうなる▼

cross-tabulation table-6

データフレームから集計表(table)を作る

上の方法で展開したデータフレーム(x)を、再びクロス集計表にしてみる。

データフレームの集計表(teble)を作る場合は、

table()

を使う。

# クロス集計表を作る
table(x)
cross-tabulation table-7

 

割合を出したかったら、

prop.table(table())

# Dementia内での割合
prop.table(table(x), 1)

# Exercise内での割合
prop.table(table(x), 2)

# 割合
prop.table(table(x))
cross-tabulation table-11
にほんブログ村 子育てブログ ワーキングマザー育児へ