読者です 読者をやめる 読者になる 読者になる

300億円欲しい

メジャーリーグのデータ解析します

Rの知識を更新したい

R

Rの知識を改めたいです.
日々パッケージが更新されているのでついていけませんが, 多少は抗いたいです.

※ 以下、個人の感想です
※ 間違いがあったら直します

イコールで代入しよう

矢印で代入するのは面倒ですよね. 実はイコールが使えます.

> x <- 100
> y = 100
> c(x,y)
[1] 100 100

関数の引数指定と混同されるとエラーになります.

> system.time(x = 10)
 以下にエラー system.time(x = 10) :  使われていない引数 (x = 10) 
> system.time(x <-10)
   ユーザ   システム       経過  
         0          0          0 

こういう時は我慢して矢印を使いましょう.
Googleのコーディング規約によると、矢印代入は怒られるみたいです。
理由が分かったら、更新します。

data.tableを使おう

データ保持の際には, dataframeを使うと思います.
もっと効率的にデータを保持してくれる, data.tableを使いましょう.

> install.packages("data.table")
> library(data.table)
> dat_dt = data.table(dat_df) # 変換
> object.size(dat_df)
136939168 bytes
> object.size(dat_dt)
126254936 bytes

data.tableとして扱うほうが, 少しだけ軽くなっています.
これはよく分かりません.
TRUE/FALSEを勝手にboolとして読んでくれていたりするのですかね?

また, うっかり巨大なデータを呼んでしまうと,

> t1 = proc.time()
> dat_df
> t2 = proc.time()
> t2 - t1
   ユーザ   システム       経過  
    28.065      0.796     29.242 

それだけで時間がかかってしまいますが, data.tableなら

> t1 = proc.time()
> dat_dt
> t2 = proc.time()
> t2 - t1
   ユーザ   システム       経過  
     0.440      0.211      0.813 

すぐに表示してくれます.
扱い方も, 殆ど変わりません.

> class(dat_df)
[1] "data.frame"
> class(dat_dt)
[1] "data.table" "data.frame"

使い方解説など.
「data.table」の検索結果 - BOD

freadを使おう

データ読み込みの時も, data.tableパッケージのfread関数を使うと楽です.
read.csvよりも速いです.

> system.time(fread("all2013.csv"))
   ユーザ   システム       経過  
     1.045      0.067      1.112 
> system.time(read.csv("all2013.csv"))
   ユーザ   システム       経過  
    14.292      0.090     14.397 

ggplot2を使おう

plotはダサいからggplot2パッケージのggplotを使いましょう.
まずこの本を読みます

R Graphics Cookbook

R Graphics Cookbook

これでOKです. 日本語版もあるみたいです.
Rグラフィックスクックブック ―ggplot2によるグラフ作成のレシピ集

Rグラフィックスクックブック ―ggplot2によるグラフ作成のレシピ集

追記
rChartも良さそうです
rChartsでR言語のデータ解析結果をダイナミックに可視化しよう (1/4):CodeZine

%>%を使おう

パイプ的な書き方で, 関数適用ができます. F#? 知らない子ですね...

> library(dplyr)
> library(magrittr)
> library(pingr)
> dim(dat_dt)
[1] 190907     97
> dat_dt %>% dim
[1] 190907     97

メジャーリーグの打席結果データからヒット数ランキングを作ります.
パイプの数を増やしまくるとこんな感じで書けます.

> pings(
+ dat_dt %>%
+ select(BAT_ID, EVENT_CD) %>%
+ filter(EVENT_CD >= 19 & EVENT_CD <= 23) %>%
+ group_by(BAT_ID) %>%
+ dplyr::summarise(HIT= n()) %>%
+ arrange(desc(HIT)) %>%
+ join(name_id, by="BAT_ID") %>%
+ filter(FULLNAME!="NA") %>%
+ select(FULLNAME, HIT) %>%
+ head(10) %>% 
+ print()
+ )
            FULLNAME HIT
 1:    Adrian Beltre 202
 2:   Dustin Pedroia 196
 3:   Miguel Cabrera 195
 4:    Daniel Murphy 193
 5:    Manny Machado 191
 6:    Robinson Cano 190
 7: Andrew McCutchen 189
 8:     Torii Hunter 186
 9:       Adam Jones 186
10:  Victor Martinez 183


!!!!! 10 Hits Combo !!!!!
!!!!! Excellent !!!!!

読まなくていいですが, 何をしているのかというと,
メジャーリーグの打席結果データについて,

BAT_IDとEVENT_CDの列をselectして,
値がEVENT_CDの値が19から23のものをfilterして,
BAT_IDでデータをgroup_byして,
ヒットの総数についてsummariseして,
ヒット数についてarrangeで並べ替えて,
名前が入っているデータとjoinして,
NAのものはfilterして除いて,
FULLNAMEとHIT列をセレクトして,
最後にトップ10を抽出してprintしています.

中間生成物を保存することなく, 一気に結果を出力できるので楽しいです.

頑張ってパイプを増やすと, 褒めてくれるパッケージがあります.
%.%を耳で感じるパッケージpingsを作りました - BOD
pings()で連鎖を増やすと楽しいです.
使いましょう.

Rcppとinlineを使おう

Rから部分的にC++を利用して, 高速な計算を実現します.
この本が欲しいです

Seamless R and C++ Integration with Rcpp (Use R!)

Seamless R and C++ Integration with Rcpp (Use R!)

まとめ

すぐに思いついたのは, 以上です