1. ホーム
  2. r

[解決済み] 比率(パーセンテージ)でコンティジェンシーテーブルを拡張する

2022-02-07 18:49:21

質問

数の分割表があるが、各グループの対応する割合で拡張したい。

いくつかのサンプルデータ( tips のデータセット ggplot2 パッケージ)を使用します。

library(ggplot2)

head(tips, 3)
#   total_bill tip    sex smoker day   time size
# 1         17 1.0 Female     No Sun Dinner    2
# 2         10 1.7   Male     No Sun Dinner    3
# 3         21 3.5   Male     No Sun Dinner    3

まず table は、喫煙者と非喫煙者をカウントするために nrow は、被験者の総数を数える。

table(tips$smoker)
#  No Yes 
# 151  93 

nrow(tips)
# [1] 244

そして、喫煙者と非喫煙者のパーセンテージを計算したい。こんな感じ(不細工なコード)。

# percentage of smokers
options(digits = 2)

transform(as.data.frame(table(tips$smoker)), percentage_column = Freq / nrow(tips) * 100)
#   Var1 Freq percentage_column
# 1   No  151                62
# 2  Yes   93                38

何か良い方法はないでしょうか?

(さらに良いのは、列のセット(列挙する)でこれを行い、ある程度きれいにフォーマットされた出力ができることです) (例: 喫煙者、曜日、時間)

どのように解決するのですか?

もし、あなたが簡潔さを求めているのであれば、次のようなものがいいでしょう。

prop.table(table(tips$smoker))

を作成し、100でスケーリングし、お好みで丸めることができます。あるいは、もっと正確に出力してください。

tbl <- table(tips$smoker)
cbind(tbl,prop.table(tbl))

これを複数のカラムに対して行う場合、どのような出力がきれいに見えるかによって、さまざまな方向性が考えられますが、ここでは1つの選択肢を紹介します。

tblFun <- function(x){
    tbl <- table(x)
    res <- cbind(tbl,round(prop.table(tbl)*100,2))
    colnames(res) <- c('Count','Percentage')
    res
}

do.call(rbind,lapply(tips[3:6],tblFun))
       Count Percentage
Female    87      35.66
Male     157      64.34
No       151      61.89
Yes       93      38.11
Fri       19       7.79
Sat       87      35.66
Sun       76      31.15
Thur      62      25.41
Dinner   176      72.13
Lunch     68      27.87

異なるテーブルを重ねるのが嫌な場合は do.call を作成し、リストで残す。