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を使いましょう.
まずこの本を読みます
- 作者: Winston Chang
- 出版社/メーカー: Oreilly & Associates Inc
- 発売日: 2013/01/03
- メディア: ペーパーバック
- この商品を含むブログを見る
Rグラフィックスクックブック ―ggplot2によるグラフ作成のレシピ集
- 作者: Winston Chang,石井弓美子,河内崇,瀬戸山雅人,古畠敦
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/11/30
- メディア: 大型本
- この商品を含むブログ (2件) を見る
追記
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!)
- 作者: Dirk Eddelbuettel
- 出版社/メーカー: Springer
- 発売日: 2013/06/14
- メディア: ペーパーバック
- この商品を含むブログを見る
まとめ
すぐに思いついたのは, 以上です