読者です 読者をやめる 読者になる 読者になる

Rでヒアドキュメント的何か

R

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)
}