skype読書会2回目メモ

ここからゲノムと計算機すか
2回目でした.今回は人少なめだったけどid:syou6162などが発声とかをしていました.*1
今回はオブジェクトの編集や保存,読み込みなどが中心.
以下みなさんのお話を黙って聞きながらメモったことなど.

fix(), edit()

edit()はオブジェクトを編集した結果を返す.
fix()はオブジェクトを編集し,編集結果をオブジェクトの内容に反映させる.Rubyで言うところの!が付いたアレみたいな感じだろうか.Ruby詳しくないので適当かどうかわからないのだけれども.
オブジェクトがmatrixやデータフレームのときはfix(),edit()を実行するとこのようなエディタが開いた.

その他のオブジェクト,例えばベクトルなどの場合,options(editor='...')で設定したエディタで編集する(多分).
手元の環境(Windows vista)だとRguiの場合はRエディタ,Rtermの場合はメモ帳,Meadow+ESSの場合はgnuclient(使えるように設定していないとエラーが出て編集できない)が既定値だった.
gnuclientはテキストとかを新規に開くとき今開いているEmacs(Meadow)で開けるというもので,ESS上でedit(hoge)とするとhogeの中身が新しいフレームなど(設定による)に表示される.便利そうなんだけど手元のMeadow+ESSで試すと若干挙動が怪しい.ベクトルを編集しようとすると固まってC-gしないと抜けられなくなるといった現象が発生している.

read.table()のas.is引数

read.table()でデータを読み込むとき,stringsAsFactors =にTRUE(既定値)を指定すると文字列は因子として読み込まれる.しかし,「1列目だけ因子にしたい」というようなことはできない.そのようなことをする場合はas.is引数を利用する.具体的には文字列を含む列のうち,因子にしたくない列にTRUE,因子にしたい列にFALSEを指定した論理値ベクトルを与える.実例を見た方が分かりやすいと思う.
http://www.okada.jp.org/RWiki/?%B0%F8%BB%D2Tips%C2%E7%C1%B4#he1d348b

dput(), dget()

lmオブジェクトみたいな複雑なヤツはdput()でテキストファイルとして保存すると良い.dget()で読み込める.オブジェクト名は保存されない.

> result <- lm(dist~speed, data=cars)
> dput(result, "foo")
> dget("foo")

Call:
 #--略--

Coefficients:
(Intercept)        speed  
    -17.579        3.932  

save(), load()

複数のオブジェクトとオブジェクト名を保存しておきたいような時はsave()でまとめて(あるいは一つでも)書き出し,必要なときはload()で読み込む.なおsave()で保存したファイルはテキストエディタでは開けない.

> x <- 1:3
> y <- c(T,F,T)
> z <- c("a","b","c")
> save(x, y, z, file="hogehoge")
> rm(x,y,z)
> x
Error: object 'x' not found
> load("hogehoge")
> x
[1] 1 2 3
> y
[1]  TRUE FALSE  TRUE
> z
[1] "a" "b" "c"

read.fwf()

データの"幅"を指定してread.tableみたいなことができる.exampleを実行すれば意味は分かると思う.

>      ff <- tempfile()
>      cat(file=ff, "123456", "987654", sep="\n")
>      read.fwf(ff, widths=c(1,2,3))    #> 1 23 456 \ 9 87 654
  V1 V2  V3
1  1 23 456
2  9 87 654
>      read.fwf(ff, widths=c(1,-2,3))   #> 1 456 \ 9 654
  V1  V2
1  1 456
2  9 654
>      unlink(ff)

覚えておけば役に立つような気がしないでもないけど,具体的にいつ役立つのかと言われると例が挙げられない.Project Eulerみたいな遊びだと役立つ問題がありそうな気はする.

data.frame()はlist扱い

write()とwrite.table()

write()だとlistが扱えないのでデータフレームを書き込めない.また,matrixもt()で転置しておかないと順序が変わってしまう.write()はcat()のラッパ.

> write
function (x, file = "data", ncolumns = if (is.character(x)) 1 else 5, 
    append = FALSE, sep = " ") 
cat(x, file = file, sep = c(rep.int(sep, ncolumns - 1), "\n"), 
    append = append)
<environment: namespace:base>

write.table()ならそのような問題はない.大抵の場合はwrite.table()で事足りるんじゃないだろうか.

sink()

sink()は出力先を変更する.例えばRguiならR Consoleに出力するのがデフォルトだが,

sink(file="foo.txt")

を実行すれば以降の出力はfoo.txtの中に書き込まれる.その間R Consoleへの出力は出なくなる.
また,引数にappend=TRUEを指定すればファイルを追記モードで開くことができ,split=TRUEを指定すればR Consoleとファイルへ同時に出力できるようになる.
終了(出力をデフォルトに戻す)するには引数なしでsink()を実行すればよい。

以上

こんなところ.まとめられないので適当にずらずら書いた.今のところは基本操作みたいなことが続くので,本文よりも脱線した部分から得るものの方が大きい.

*1:実はid:yag_aysの声と判別できなかった事が何度かあった.やはりやぐさんには次回から一人称わっちで(ry