2012年10月11日木曜日

クリップボード経由で R とExcel を使う

追記(11/17):せっかくなので関数化した。
マトリックス or データフレームならそのまま、それ以外は転置をとってクリップボードに書き出す。

#mac の場合
cpy <- function(a){
    if(is.data.frame(a) | is.matrix(a)){ write.table(a, pipe("pbcopy"), sep="\t", row.names=FALSE, quote=FALSE)
    }else write.table(t(a), pipe("pbcopy"), sep="\t", row.names=FALSE, quote=FALSE)
}
#windows の場合
cpy <- function(a){
    if(is.data.frame(a) | is.matrix(a)){ write.table(a, file="clipboard", sep="\t", row.names=FALSE, quote=FALSE)
    }else write.table(t(a), file="clipboard", sep="\t", row.names=FALSE, quote=FALSE)
}

ちなみに .Rprofile というファイル名で作業ディレクトリに保存しておくと、R を起動したとき自動的に読み込まれる。mac の場合は .Rprofile の改行コードを LF にする必要があるようだ。



ちょっとした表を作るときなどに使う小技をメモ


ウィンドウズの場合:
クリップボードから読み込み;
a <- read.table("clipboard", header=TRUE) 
クリップボードに書き出し;
write.table(a, file="clipboard",sep="\t" ,row.names=FALSE)
# "\t" はタブ

マックの場合:
クリップボードから読み込み;
a <- read.table(pipe("pbpaste"))
クリップボードに書き出し;
write.table(a, pipe("pbcopy"), sep="\t", row.names=FALSE)


例えばこんな Excel の表があるとして、

コピーして
read.table で R に読み込むと

こんな感じ。

あるいはwrite.tableで R から書きだして

ペーストして、横に並べたりして
行名を書き出すのは
write.table(row.names(a), pipe("pbcopy"), sep="\t",row.names=FALSE, col.names=FALSE)
(ウィンドウズだと write.table(row.names(a), file="clipboard", sep="\t", row.names=FALSE, col.names=FALSE) )
で、

 こんな感じだ。


参考&関連リンク:
R の初歩
ちょっとした R のこと
表計算シートをクリップボード経由で読み込みクロス表(分割表)を作成・保存する手順