data.frame()
を使わない」
こと.
すなわち readLines()
で読んで変換してただちに
writeLines()
ですぐに吐きだす,
という方式.
try(gsub(...))
でごまかす.
writeLines()
はいろいろ不便なので
out <- file(file.output, "w") ... cat(..., file = out) ... close(out)と
cat()
で吐きだす方法にした.
gsub(...)
による置換が増えてしまった,
これがえらく時間がかかるので
(R の弱点は文字列処理か?
……
後記:
あとになってようやく気づいたんだが,
data.frame 一行ずつ gsub(...)
やらせるのは最悪な処理だ,
というのも行数ぶん正規表現を「こんぱいる」することになるから;
教訓:
gsub(...)
などは「全データかためて」ほどこすべし)
……
けっきょく松田さん PC に
ActivePerl
をインストールして Perl で処理することに.
多少のめんどうな置換 (コンマ濫用対策とか)
をやらせてもなお,
やはり Perl は「むちゃくちゃ」速い.
data.frame()
のハナシ.
たとえば列を置換する場合には,
sapply()
で「いっぱつ置換」しないと使わないと遅くて
(あまり良い例ではないかもしれないけど)
df$x <- sapply(df$x, function(v) ifelse(v < 50, "A", "B"))
といったふうに書かないといけない.
> (treatment <- factor(c("1", "2", "control"))) [1] 1 2 control Levels: 1 2 control > factor(treatment, levels = c("control", "1", "2")) [1] 1 2 control Levels: control 1 2あるいは最初に
factor(...)
するところで水準を指定すれば簡単だが,
> (treatment <- factor(c("1", "2", "control"), levels = c("control", "1", "2"))) [1] 1 2 control Levels: control 1 2このワザを使いたくなるのは
read.csv()
で読んだデータの水準変換だからね.
その場合は上とおなじくいっぱつ置換.
> df$x <- factor(df$x, levels = c("control", "1", "2"))