クロス表作成のための俺俺関数

マネイジメント実習でクロス表を作ったりしました。クロス表ってのは結構簡単なので、解析にそんなに詳しくない人に対しても使える(説明する側がそれほど手法を知らない、みたいな状況がこの前の実習w)のがいいところです。しかしながら、使えそうな結果を得るためには結構クロス表を書かねばならず、それが結構めんどい。この前はSPSSでやってExcelで加工とかやってたわけですが、正直やってらんない。

ということで、必要な情報を載せた加工済みのcsvファイルを出力するための関数をRで書いた。tableの型を分解して、再結合させるのに結構手間取った。

make.table <- function(x,y,data=NULL){
  attach(data)
  row <- length(levels(x))+1
  col <- length(levels(y))
  my.table <- matrix(0,row,col)
  for(i in 1:row-1){
    my.table[i,] <- table(x,y)[i,]/apply(table(x,y),2,sum)*100
  }
  my.table[row,] <- apply(table(x,y),2,mean)/apply(table(x,y),2,sum)*100
  attributes(my.table)$dimnames <- list(c(paste(levels(x)[1],"(N=",apply(table(x,y),1,sum)[1],")",sep="")
                                          ,paste(levels(y)[2],"(N=",apply(table(x,y),1,sum)[2],")",sep="")
                                          ,paste("全体(N=",apply(table(x,y),1,sum)[2]+apply(table(x,y),1,sum)[2],")",sep=""))
                                        ,levels(y))
  names(attributes(my.table)$dimnames) <- c(deparse(substitute(x)),deparse(substitute(y)))
  as.table(t(as.matrix(my.table)))
  detach(data)
  return(my.table)
}

make.csv <- function(d){
  cat(",")
  cat(colnames(d),sep=",",fill=TRUE)
  nv <- ncol(d)
  n <- nrow(d)
  for (i in 1:n) {
    cat(rownames(d)[i],",",sep="")
    cat(d[i,],sep=",",fill=TRUE)
  }
}

library(MASS)
attach(quine)
my.table <- make.table(Sex,Age)
make.csv(my.table)

make.table関数にありそうな場合を投げまくって、sinkとかで出力をなんとか.csvみたいな形にしておけば後はexcelでグラフ作るだけ、みたいなことができる。グラフ出力までRで完結させて「うまー」なことをやりたかったわけだが、今のところうまくいっていない。全体のやつを載せないでbarplotやるといけるのだが、全体のを加えると欲しいところが出てこない。