「データセットについてのメモ」の中で,table 関数を使うたびに分析で使う変数と ケースの subset を作っている。
少なくとも,変数の subset を毎回作る必要はない。
また,3次元以上の集計表を第3次元ごとに繰り返している。
で、35歳で層別化して出産回数と人工流産回数を見たい場合は、こんな感じでしょうか?
> table(subset(x,subset=age=="<35",select=c(parity, induced)))
induced
parity 0 1 more
1 52 17 0
>1 40 33 26
> table(subset(x,subset=age!="<35",select=c(parity, induced)))
induced
parity 0 1 more
1 24 6 0
>1 27 12 11
これは,xtabs 関数を使うと,何の苦もなく一発で結果が出る。x は既に作成されているデータフレーム。
> xtabs(~parity+induced+age, x)
, , age = <35
induced
parity 0 1 more
1 52 17 0
>1 40 33 26
, , age = >=35
induced
parity 0 1 more
1 24 6 0
>1 27 12 11
「data.frameのrbindにはみんな苦労しているようだ」で紹介されている関数
以下のように作ると,コンパクトにまとまった
rbind3 <- function(lst) {
nr <- sapply(lst, nrow)
end <- cumsum(nr)
start <- c(0, end[-length(lst)])+1
names <- unique(c(sapply(lst, colnames)))
result <- as.data.frame(matrix(NA, sum(nr), length(names)))
colnames(result) <- names
mapply (function(d, s, e) result[s:e, names %in% colnames(d)] <<- d, lst, start, end)
return(result)
}
実行例
> x <- data.frame(A=1:5, B=5:1, row.names=1:5)
> y <- data.frame(B=1:5, C=5:9, row.names=1:5)
> z <- data.frame(C=3:8, A=8:13, row.names=2:7)
> rbind3(list(x, y, z))
A B C
1 1 5 NA
2 2 4 NA
3 3 3 NA
4 4 2 NA
5 5 1 NA
6 NA 1 5
7 NA 2 6
8 NA 3 7
9 NA 4 8
10 NA 5 9
11 3 NA 8
12 4 NA 9
13 5 NA 10
14 6 NA 11
15 7 NA 12
16 8 NA 13