忍者ブログ
3

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

# psychパッケージのdescribe.by関数でもいいが…

# グループごとの記述統計
aggregate(iris[1:4], list(iris[,5]), mean, na.rm=TRUE) # 平均
## これでも同じ aggregate(iris[1:4], iris[5], mean, na.rm = T)
aggregate(iris[1:4], list(iris[,5]), median, na.rm=TRUE) # 中央値
aggregate(iris[1:4], list(iris[,5]), sd, na.rm=TRUE) # 標準偏差
aggregate(iris[1:4], list(iris[,5]), max, na.rm=TRUE) # 最大値
aggregate(iris[1:4], list(iris[,5]), min, na.rm=TRUE) # 最小値
aggregate(iris[1:4], list(iris[,5]), length) #データ数、NAなし
aggregate(iris[1:4], list(iris[,5]), function(x) length(na.omit(x))) # データ数、NA抜き
aggregate(iris[1:4], list(iris[,5]), function(x) sum(is.na(x))) # データ数、NAのみ

# 追加
by(iris[1:4], list(a = iris[,5]), summary)
library(psych)

describe(iris)
by(iris[1:4], list(a = iris[,5]), describe)

describe.by(iris[1:4], iris[5])
PR
先に結論: 単にクロス集計表をつくるなら、Excelのピボットテーブルの方が楽

table, xtabs, ftableがある
組み込みデータフレームesophを使う
"agegp","alcgp","tobgp","ncases","ncontrols" の5列

table(esoph[c(1,2,3)])
1(agegp) が縦軸、2 (alcgp) を横軸にして、3 (tobgp) の群の数だけクロス集計表ができる
2元の集計表が複数ほしいときに使おう

xtabs(~ agegp + alcgp + tobgp, esoph)
上のtableと同じ表を返す
チルダの前にnumericの列をおくと、グループごとに数値を合計した結果が返される
xtabs(ncases ~ agegp + alcgp, esoph)

ftable(esoph[,1], esoph[,2], esoph[,3])
3元 (以上) の集計表をつくりたいときはこれ
一番最後の変数 (esoph[,3]) が横軸 (上) にきて、あとは左から並ぶ
row.vars=3, row.vars=c(1,3)...とかで左 (同様にcol.var...) にくる変数を選べる

小計欄が必要なときは
## 先にxtabsで2元のグラフをつくり、
xtbs <- xtabs(~ agegp + alcgp + tobgp, esoph)
## 合計欄を追加して
xmgn <- addmargins(xtbs)
## ftableに渡す
ftable(xmgn)
## ftableにaddmargins関数を使うとなぜか変数名が消えて行列になるのでやめよう

明らかにExcelのピボットテーブルの方が楽

ただ、xtabs, table関数の結果は"table"というクラスになり (xtabsは"xtabs"というのももつ)
summary(xtbs) としたり、chisq.test(xtbs) でカイ二乗検定を行えるのでその点は便利
chisq.testは2次元表しか対応してないため、3次元表も2次元行列と解釈してしまうが、summaryは3次元表としてカイ二乗検定をしてくれるそうだ (xtabsヘルプより)
(もちろんこのとき合計欄をつけてはいけない)

青木先生の関数を使うとファイ係数、一致係数、クラメール係数などが算出できる。感謝
phi, contingency, cramer, chisq

vcdパッケージについては今度調べよう
中澤先生のサイトに使用例あり。感謝
データフレームの列 (変数ごと) に記述統計を出したい

最小値,第1 四分位点,中央値,平均,第3 四分位点,最大値を求める
summary(dat) # NAは自動的に除かれる

不偏標準偏差、不偏分散、標準誤差、データ数 (NAこみ、NAなし、NA) 、歪度、尖度、標本標準偏差、標本分散を求める
##メモ: na.omit(x)はNAを除いてベクトルの要素をそのまま返す。!is.na(x)はTRUE/FALSEを返す。だから数を数えたいときは!is.naを使う。
sd(dat, na.rm=T) # 不偏標準偏差
sd(dat, na.rm=T)^2 # 不偏分散
sapply(dat, function(x) sqrt(var(as.vector(na.omit(x)))/length(na.omit(x)))) 標準誤差
sapply(dat, length) # データ数、NAこみ
sapply(dat, function(x) length(na.omit(x))) # データ数、NAなし
sapply(dat, function(x) sum(is.na(x))) # NAの数
sapply(dat, function(x) mean((na.omit(x)-mean(na.omit(x)))^3)/(sd(na.omit(x))^3)) # 歪度。データにNAがあった場合、省いて計算したいできた
sapply(dat, function(x) mean((na.omit(x)-mean(na.omit(x)))^4)/(sd(na.omit(x))^4)) # 尖度。上に同じ
sapply(dat, function(x) sqrt(var(na.omit(x))*(length(na.omit(x))-1)/length(na.omit(x)))) # 標本標準偏差
sapply(dat, function(x) var(na.omit(x))*(length(na.omit(x))-1)/length(na.omit(x))) # 標本分散。#なぜかわからんがvarは因子変数にも適用できるようだ
   # var(x, na.rm=T) でも同じ

グループ別の統計量
aggregate(iris[1:4], iris[5], mean, na.rm = T)

その他
rowMeans(dat, na.rm=TRUE) # 行ごとの平均、NAを抜く
rowSums(dat, na.rm=TRUE) # 行ごとの合計、NAを抜く
apply(dat, 1, function(x) sum(is.na(x))) #行ごとのNA数  
sum(complete.cases(dat)) # データフレーム全体で欠損値の無いケース数を調べる
sum((na.omit(x)-mean(na.omit(x)))^2) # 平方和
プロフィール
HN:
tao
HP:
性別:
非公開
職業:
会社員
趣味:
アウトドア、自転車、ジョギング、英語学習
自己紹介:
・千葉在住のサラリーマンです。データ分析っぽいことが仕事。
・今年英検1級取得。今はTOEIC高得点を目指して勉強中。
・興味のあることは野球、アウトドア、英語学習、統計、プログラミング、PC関係などなど。
ブログ内検索
freead
順位表
プロ野球データFreak
セリーグ順位表
パリーグ順位表