StatsBeginner: 初学者の統計学習ノート

統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。たまにMacの話題。

Rでよく忘れる、よく間違える書き方(随時追記)

よく忘れることのメモです。

  • 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回重ねないといけない。