Rの勉強会をやったりするときに、「これをコピペして、hoge.csvって名前付けて、read.csvやって…」ってやるのは意外と面倒だったりする。勉強会は端末室でやったりするんだけど、端末だとwindowsで、Cのprogram filesが共有なので、そこには保存できないからworking directoryを変更etc等をやらないといけないのだが、全員に教えるのも結構面倒。あと、これ知ってる人でもhoge.csvとかめんんどいから作りたくない、って感じる人もいるかもしれない。
で、Perlとかにヒアドキュメントという仕組みがあるので、それを利用できないかと考えた。Rだとこんな感じか。
hatiroku <- "id,sex syou6162,male Hash,male kaeru_san,female suztomo,male kuroneko,female"
で、これをdata.frameに加工できれば、一般的なread.csvやったのと同じ感じになるので、それを目指すことにする。
で、そのために以下を実行。無駄にMapとかReduceとかが入っているのは、気にしないでください。改行で、strsplitしてできた各ベクトルに、コンマでもう一回strsplitしてます。で、Reduceで一旦ベクトルにしてやって、行列→data.frameのような加工をしてます。
d <- Map(function(x){strsplit(x,",")[[1]]},strsplit(hatiroku,"\n")[[1]]) colum_name <- d[[1]] len <- length(colum_name) d <- as.data.frame(matrix(Reduce(c,d,c()),ncol=len,byrow=TRUE)[-1,]) names(d) <- colum_name
すると欲しい感じのデータフレームができあがっている。
> d id sex 1 syou6162 male 2 Hash male 3 kaeru_san female 4 suztomo male 5 kuroneko female
関数にしておく
自分のメモですよ。ヒアドキュメントの文字列をdata.frameに変換する関数。here_document_to_data_frame <- function(x){ d <- Map(function(x){strsplit(x,",")[[1]]},strsplit(x,"\n")[[1]]) colum_name <- d[[1]] len <- length(colum_name) d <- as.data.frame(matrix(Reduce(c,d,c()),ncol=len,byrow=TRUE)[-1,]) names(d) <- colum_name return(d) }