マネイジメント実習でクロス表を作ったりしました。クロス表ってのは結構簡単なので、解析にそんなに詳しくない人に対しても使える(説明する側がそれほど手法を知らない、みたいな状況がこの前の実習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やるといけるのだが、全体のを加えると欲しいところが出てこない。