よく忘れることのメモです。
- NAかどうかの判定にはx==NAとかではなくis.na(x)を使う
- 要素に含まれるかどうかの判定は、%in%かis.element()を使う。これはデータ全体の中から何かを抽出するときの条件を複数条件にしたい場面でも使えるときがある。(たとえば簡単なところでは、subset()でデータフレームから条件付の抽出をするとき、&で条件を並べなくてもよくなったりとか)
> is.element(3, c(1,2,3)) [1] TRUE > 3 %in% c(1,2,3) [1] TRUE
- {dplyr}でデータフレームを操作した後、as.data.frame()で標準のデータフレームに戻してからじゃないと、別の関数に与えたときにエラーが出る場合がある
- {data.table}のfread()関数でcsvとかを読み込んだ場合も、それを標準のデータフレームにしてから使わないとエラーが出ることがある
- factor型のデータをnumericに変えると、factorの中身ではなくレベル(水準)番号が数字になる。
> x <- as.factor(c(1,10,100,1,10,100)) > as.numeric(x) [1] 1 2 3 1 2 3
- リストに要素をアペンドするとき、c()関数でできるのだが、付け加える方にlist()をかけとかないといけない
> x1 <- c(1,2,3) > x2 <- c('a','b','c') > l1 <- list(x1, x2) > print(X) [[1]] [1] 1 2 3 [[2]] [1] "a" "b" "c" [[3]] [1] "あ" [[4]] [1] "い" [[5]] [1] "う" > x3 <- c('あ','い','う') > l2 <- c(l1, x3) # これはダメ > print(l2) [[1]] [1] 1 2 3 [[2]] [1] "a" "b" "c" [[3]] [1] "あ" [[4]] [1] "い" [[5]] [1] "う" > l3 <- c(l1, list(x3)) # こうする > print(l3) [[1]] [1] 1 2 3 [[2]] [1] "a" "b" "c" [[3]] [1] "あ" "い" "う"
- パネルデータをロング型にしたりワイド型にしたりするのには{tidyr}を使う。ワイドをロングにするのはgather()関数で、ロングをワイドにするのはspread()関数で。
- ||とか&&は、or/and条件を入れ子にするときに使う。
- ベクトルの要素が「全て◯◯という値である」という条件を書くシンプルな方法はたぶんない?最大と最小が一致するみたいな書き方をいつもしているのだが。
- データを「中心化」(平均ゼロにする)したいときは、center()じゃなくて、scale()関数のオプションでscale=Fに設定する。変な話だが。
- apply()の第一引数は小文字のxではなく大文字のX。まあ、書かなければいいともいえるが、書くときによく間違える。
- logicalのベクトルでTRUEの個数を数えるには、length(x[x==TRUE])とかsum(x==TRUE)で数えられる。
- 欠損値のない行にしぼりたいときは、d[complete.cases(d),]でOK。
- plotで散布図の記号を文字(国の名前とか人の名前とか)にしたいなら、散布図の方は色を"white"にして消して、text(x, y, labels=)とすればよい。
- 離散変数の値ごとのヒストグラムを得たいとき、hist(x)としてしまうと、離散値に対応するバーが目盛りの左側に来てしまう。これを回避するには、barplot(table(x))とすればよい。
- 回帰係数の信頼区間の出し方をいつも忘れるが、confint(model, level=0.95)
- 主成分分析の結果は符号が想定とは逆になってることがあり、必要ならマイナスをかけて戻すのを忘れないように
- applyでFUNに第二引数以降をわたしたいときは、FUNの後ろにそのまま続けていけばよい。
d <- data.frame( A = c(1,2,3,4,5), B = c(2,4,NA,8,10), C = c(1,3,5,7,9) ) apply(d, MARGIN=1, FUN=mean, na.rm=T)
- dplyrでパイプライン%>%を使うとき、関数定義から埋め込みたい場合は、%>% (functon(p){hoge}) %>%と、()でかこむ。
- 意外と検索しても見つからないのだが、ggplot2で凡例が小さすぎて点線とか意味わからないのは、theme(legend.key.width=unit(2,"cm"))として解決。
- dplyrのmutateで、複数の列に一気に同じ処理をしたいときは、mutate_at(var(hoge), funs(f(.)))とし、hogeのところにはstart_withとかが使えるし、ある変数以外を指定したいなら-をつければよい。
- たまにRでエクセルのファイルを読みたい時は、今なら、gdataパッケージがいいのではないかと思う。
library(gdata) df <- read.xls('ファイル名')
- dplyrのなかで差分を取りたいときは、diffじゃなくてlagをつかって、mutate(x = x - lag(x))とする。
- 正規表現でエスケープするとき、バックスラッシュ\は2回重ねないといけない。
- dplyrで、少なくともselect、lead、lagは毎回"dplyr::"つけたほうがいい。
- 空のデータフレームをつくるとき、matrixをas.data.frame()するのがよいが、これに1行目のデータを与えるときにrbindをつかってしまうと列名称が変わってしまうので、インデックスを指定して与えるようにする必要がある。
as.data.frame(matrix(c(NA,NA),nrow=1))
- read.csv()するとき、stringsAsFactors = Fオプションをとにかく付けるように習慣づけないと、おもわぬエラーが起きる。
- データフレームにscale()を適用すると、各列を標準化してくれるが、返り値がmatrixになってしまうので、たとえばlm関数のdata欄に直接与えることができない。すこしめんどうだが、numeric型の列を抽出し標準化してデータフレームに直す必要があるので、以下のような感じになる。
lm(y~x, data=d %>% select_if(is.numeric) %>% scale() %>% as.data.frame())
- RStudioでggplot2を使っている時に、
Error in grid.Call(C_convert, x, as.integer(whatfrom), as.integer(whatto), : Viewport has zero dimension(s)
というようなエラーがでるときがあるが、コードが間違っているのではなく、plotが出るペインの掃除ボタン(ほうきのマーク)を押すと解消したりする。
- dplyrでcomplete.cases()をやりたいときは、filter(complete.cases(.))とする。
- AとBに挟まれた部分を取る正規表現
"(?<=A)(.*)(?=B)"
- warningを消したい時、単にinvisible()をかければいいのではなくて、以下のようにcapture.output()を入れ子にする。
invisible(capture.output())
- ggplot2で"Error in .Call.graphics(C_palette2, .Call(C_palette2, NULL)) : invalid graphics state"などよくわからないエラーがでたときは、とりあえずRStudioのplot欄を掃除する(clear all plots)
- 特定のオブジェクトだけ残して自作のオブジェクトを全部消したいときは、
rm(list=ls()[which(ls() != 'hogehoge')])
- forループの進捗を表示させたいとき、以下のような感じにすればよい。(1000周ごとに表示)
if(i %% 1000 == 0) {message('\r', paste(i, ' / ', length(xxx)), appendLF=FALSE)}
- glmでたとえばロジスティック回帰をやったとき、予測値は0,1ではなく0-1の少数の形で以下のコードで得られる。typeのところはデフォルトでは'link'になるが、これは線形予測子を得るもの。type='response'にしておくと、リンク関数を経たものが得られる。
predict(model, type='response') predict(model, type='response')
- lmとかglmオブジェクトから、「投入したデータフレーム」は$modelで取り出せる。stepしている場合は、最終的に選択されたモデルのデータフレームが取り出せる。で、ポイントとしては、目的変数が必ず1列目に来るようになっていることと、NAはオミットされてcomplete.casesになっているということ。predict関数を使うときに(newdataに与えるので)覚えておくと便利。
- 重み付き最小二乗法をやるときはlm(weights=)という引数をつけるが、predictで予測値を出すときは、predictの中にweightsとか書かなくてもよい。lmオブジェクトの$model内の最後に(weights)っていう列ができててそれが勝手に考慮される。predict内にweightsって書いても無視されてるっぽい(変な値を与えても影響がない)。