plyrパッケージで君も前処理スタ☆第30回 勉強会@東京(#TokyoR)@teramonagi
plyrパッケージで君も前処理スタ☆第30回 勉強会@東京(#TokyoR)@teramonagiplyrパッケージ徹底入門
自己紹介• ID:@teramonagi• お仕事:遊撃• 興味:/C++/R/python/F#/数理/可視化/金融/web/3春ですね。新たな出会いの季節ですね。
春は出会いの季節• 各所に配属される新人• バイト先に新しく入って来たイケメン• 隣に越してきた美人のおねぇさん• 進振りで一緒になった同級生• たまたま講義で横に座ったあの子etc……4
そんな季節の病•恋煩い• 【意味】恋するあまりの悩みや気のふさぎ。恋のやまい(Goo辞書より引用)5
似たような病•分析煩い• 分析するあまりの悩みや気のふさぎ。業務上の病。(teramonagi語録より引用)• 「分析したい…でもその前の処理が面倒くさい…集計も面倒くさい…」6
そんな貴方にお勧めしたいplyrパッケージ(“プライヤー”と読む)7
作者はggplot2のhadley8http://had.co.nz/より
最近だとビッグデータの可視化も9Revolutionsブログ(http://blog.revolutionanalytics.com/) 2013/4/8の記事より
10plyrで何が出来るの?
plyrの主なお仕事• データを分割し、それぞれに処理を適用し、そして結合して戻すという、分析の基本的な流れを楽にしてくれる• 例:年齢・性別ごとデータを分割し、ある需要予測モデルを適用し予測を実施、その結果を再結合して出力したい11
plyrの思想• Split(分割):–指定した特徴量でデータ分割• Apply(適用)–分割データに対する関数を適用• Combine(結合)–適用した結果を再結合し出力12
使用するデータ:airquality• ニューヨークの大気状態観測値• 各列の説明– Ozone:オゾン量(ppb)– Solar.R:太陽光の強さ(Langley)– Wind:平均風速(mph)– Temp:最高気温 (degrees F)...
何はともあれ可視化しておく14Ozone501001500 50 100 150Cor : 0.3485: 0.2436: 0.7187: 0.4298: 0.539: 0.18Cor : -0.6125: -0.4516: 0.3577: -...
一番良く使う関数(群)15入力出力
入出力の型に応じた関数表入力/出力 arraydata.framelist なしarray aaply adply alply a_plydata.frame daply ddply dlply d_plylist laply ldply ll...
従来のRの関数との対応入力/出力 arraydata.framelist なしarray apply adply alply a_plydata.framedaply aggregate by d_plylist sapply ldply la...
パッケージの導入&読込> install.packages("plyr")trying URLhttp://cran.rstudio.com/bin/windows/contrib/3.0/plyr_1.8.zip……(途中省略)> #ライブラ...
データをざっとチェック> head(airquality)Ozone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 23 12 149 12.6 74 5 34 ...
Misson 120私よ。すぐに月毎の平均気温を出して
ddply関数でやってみる> #名前を短くしておく> aq <- airquality> #月ごとの平均気温を出す> ddply(aq,"Month“,summarize,AveTemp=mean(Temp))Month AveTemp1 5 ...
忘れちゃいけないplyrの思想> #名前を短くしておく> aq <- airquality> #月ごとの平均気温を出す> ddply(aq,"Month“,summarize,AveTemp=mean(Temp))Month AveTemp1 ...
月ごとの平均気温を出す2> #月ごとの平均気温2 with “.()”関数> ddply(aq, .(Month), summarize,AveTemp=mean(Temp))Month AveTemp1 5 65.548392 6 79.10...
• Excelだと…(既に目にくる)月ごとの平均気温を出す324
複数の結果も算出可能> #複数の結果でもOK> ddply(aq, .(Month), summarize,AveTemp=mean(Temp), SdTemp=sd(Temp))Month AveTemp SdTemp1 5 65.54839...
Misson 226あの男に連絡よっ!すぐに月毎の平均オゾン量を出させなきゃ…
同じように…しかしデータにNAが> ddply(aq, .(Month), summarize,AveOzone=mean(Ozone))Month AveOzone1 5 NA2 6 NA3 7 NA4 8 NA5 9 NA27
meanにna.rm=TRUEを追加> ddply(aq, .(Month), summarize,AveOzone=mean(Ozone, na.rm=TRUE))Month AveOzone1 5 23.615382 6 29.444443...
プログレスバーも導入可能> ddply(aq, .(Month), summarize,AveTemp=mean(Temp), .progress="text")|===============================| 100%Mon...
.parallel引数について• XYply系関数に.parallel引数が存在• 「重い…」とdisられるXYplyの救世主• 字面通り処理を並列化してくれる(私のwindows環境で動かせなかったので言及のみ…誰かはよ)30
Misson 331気温についてより細かく場合分けしたいわね…
transform:変数操作で列追加> #各月の平均気温以上の場合1、そうじゃないなら0となるフラグを追加> aq<-ddply(aq,.(Month),transform,HighTemp=ifelse(Temp-mean(Temp)>0,1...
月・平均気温毎の平均風速> #月・平均気温以上(以下)毎に平均風速を計算> ddply(aq, .(Month, HighTemp),summarize, AveWind=mean(Wind))Month HighTemp AveWind1 5...
Misson 434ところでこのデータってどのくらい欠損値があった?
colwise:列毎への関数適用> #nmissing関数:欠損値の個数をカウント> nmissing<-function(x)sum(is.na(x))> #各列に対して関数を適用した結果を抽出> colwise(nmissing)(aq)O...
ddply + colwise = 強力> #月毎の各列の欠損値の個数> ddply(aq,.(Month),colwise(nmissing))Month Ozone Solar.R Wind Temp Day HighTemp1 5 5 4...
生Rで書くと…>miss.by.month<-by(aq,aq$Month,colwise(nmissing))>cbind(expand.grid(dimnames(miss.by.month)),do.call("rbind",miss.b...
Misson 538Excel野郎に分析させるから月毎にデータを全部csvで保存してくれ
d_ply:出力なしのddply> #月毎に分割したデータをファイルに保存> d_ply(aq, .(Month), function(x){+ month <- x$Month[1]+ write.csv(x,paste0("airquali...
40plyr is Ready for Business
41以下、その他便利関数紹介
rlply:指定回数繰り返し処理42> #オゾン量と気温の回帰分析を100ランダムサンプリングして実施する関数> f <-function(){lm(Ozone~Temp,aq[sample(nrow(aq),100,replace=TRUE)...
rlply:指定回数繰り返し処理43> library(ggplot2)> qplot(laply(lms,function(x)coef(x)[2]), geom = "blank") ++geom_histogram(binwidth=0....
mdply:引数として同一関数適用> #(平均・分散)={(1,1),(2,2),(3,3)}となるような正規分布に従う乱数をn=2個ずつ生成> mdply(data.frame(mean=1:3,sd=1:3),rnorm,n=2)mean ...
arrange:ソート> arrange(aq,Ozone)Ozone Solar.R Wind Temp Month Day HighTemp1 1 8 9.7 59 5 21 02 4 25 9.7 61 5 23 03 6 78 18.4...
arrange:ソート> #降順でのならべかえ> arrange(aq,desc(Ozone))Ozone Solar.R Wind Temp Month Day HighTemp1 168 238 3.4 81 8 25 02 135 269...
arrange:ソート> #複数の列も指定可能> arrange(aq,Ozone,desc(Solar.R))Ozone Solar.R Wind Temp Month Day HighTemp1 1 8 9.7 59 5 21 02 4 2...
rbind.fill:欠損値補完付きrbind> df<-data.frame(Ozone=33.00)> rbind(aq,df)Error in rbind(deparse.level, ...) : 引数の列の数が一致しません> rbin...
count:データ数勘定> #各月ごとに何個データあるか> count(aq,.(Month))Month freq1 5 312 6 303 7 314 8 315 9 30> #↓とほぼ同じ> ddply(aq,"Month",nrow)49
name_rows:行名保存&復元> # arrange等,plyrの関数は行名非保存> arrange(aq, Ozone)Ozone Solar.R Wind Temp Month Day1 1 8 9.7 59 5 212 4 25 9....
name_rows:行名保存&復元> arrange(name_rows(aq), Ozone)Ozone Solar.R Wind Temp Month Day .rownames1 1 8 9.7 59 5 21 212 4 25 9.7 ...
splat:同名の列処理> ozone.per.solar<-function(Ozone,Solar.R,...){Ozone/Solar.R}> head(aq,1)Ozone Solar.R Wind Temp Month Day Hig...
round_any:値の丸め込み> # 10の位に丸め込み(1の位で四捨五入)> round_any(135,10)[1] 140> # 10の位に丸め込み(1の位で切り捨て)> round_any(135,10,floor)[1] 130> ...
rename:列名の置換> # Ozone列をOooozoneという列名へ>rename(aq,replace=c(Ozone="Oooozone"))Oooozone Solar.R Wind Temp Month Day1 41 190 7...
mapvalues,revalue:値の置換> x <- c("a", "b", "c")> #a⇒AAA,c⇒CCCと変換。数値もいける>mapvalues(x,c("a“,"c"),c("AAA","CCC"))[1] "AAA" "b" ...
Happy debugging> #デバッグする時に便利な書き方> ddply(aq,.(Month),function(x)browser())Called from: .fun(piece, ...)Browse[1]> xOzone So...
Enjoy!!!57ぽんちん
参考• H.Wickham氏の各種slide– http://www.slideshare.net/hadley/presentations• Stackoverflowの[plyr]tag– http://stackoverflow.com/...
Upcoming SlideShare
Loading in …5
×

「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」

21,780 views

Published on

第30回R勉強会@東京(#TokyoR)の資料

Published in: Technology
0 Comments
91 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
21,780
On SlideShare
0
From Embeds
0
Number of Embeds
3,239
Actions
Shares
0
Downloads
270
Comments
0
Likes
91
Embeds 0
No embeds

No notes for slide

「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」

  1. 1. plyrパッケージで君も前処理スタ☆第30回 勉強会@東京(#TokyoR)@teramonagi
  2. 2. plyrパッケージで君も前処理スタ☆第30回 勉強会@東京(#TokyoR)@teramonagiplyrパッケージ徹底入門
  3. 3. 自己紹介• ID:@teramonagi• お仕事:遊撃• 興味:/C++/R/python/F#/数理/可視化/金融/web/3春ですね。新たな出会いの季節ですね。
  4. 4. 春は出会いの季節• 各所に配属される新人• バイト先に新しく入って来たイケメン• 隣に越してきた美人のおねぇさん• 進振りで一緒になった同級生• たまたま講義で横に座ったあの子etc……4
  5. 5. そんな季節の病•恋煩い• 【意味】恋するあまりの悩みや気のふさぎ。恋のやまい(Goo辞書より引用)5
  6. 6. 似たような病•分析煩い• 分析するあまりの悩みや気のふさぎ。業務上の病。(teramonagi語録より引用)• 「分析したい…でもその前の処理が面倒くさい…集計も面倒くさい…」6
  7. 7. そんな貴方にお勧めしたいplyrパッケージ(“プライヤー”と読む)7
  8. 8. 作者はggplot2のhadley8http://had.co.nz/より
  9. 9. 最近だとビッグデータの可視化も9Revolutionsブログ(http://blog.revolutionanalytics.com/) 2013/4/8の記事より
  10. 10. 10plyrで何が出来るの?
  11. 11. plyrの主なお仕事• データを分割し、それぞれに処理を適用し、そして結合して戻すという、分析の基本的な流れを楽にしてくれる• 例:年齢・性別ごとデータを分割し、ある需要予測モデルを適用し予測を実施、その結果を再結合して出力したい11
  12. 12. plyrの思想• Split(分割):–指定した特徴量でデータ分割• Apply(適用)–分割データに対する関数を適用• Combine(結合)–適用した結果を再結合し出力12
  13. 13. 使用するデータ:airquality• ニューヨークの大気状態観測値• 各列の説明– Ozone:オゾン量(ppb)– Solar.R:太陽光の強さ(Langley)– Wind:平均風速(mph)– Temp:最高気温 (degrees F)– Month:月– Day:日13
  14. 14. 何はともあれ可視化しておく14Ozone501001500 50 100 150Cor : 0.3485: 0.2436: 0.7187: 0.4298: 0.539: 0.18Cor : -0.6125: -0.4516: 0.3577: -0.6678: -0.749: -0.61Cor : 0.6995: 0.6136: 0.6687: 0.7238: 0.6059: 0.828Solar.R1002003000 100 200 300Cor : -0.1275: -0.2176: 0.6127: -0.2348: -0.1889: -0.0939Cor : 0.2945: 0.4826: 0.6477: 0.3318: 0.4579: 0.123Wind1015205 10 15 20Cor : -0.4975: -0.2996: -0.08777: -0.4698: -0.4769: -0.579Temp70809060 70 80 90Month56789GGallyパッケージを用い筆者作成(「美しい ペアプロット クオンツ」あたりで検索)
  15. 15. 一番良く使う関数(群)15入力出力
  16. 16. 入出力の型に応じた関数表入力/出力 arraydata.framelist なしarray aaply adply alply a_plydata.frame daply ddply dlply d_plylist laply ldply llply l_ply繰り返し(repeat) raply rdply rlply r_ply関数引数(multi?) maply mdply mlply m_ply16赤字:本資料で取り扱う関数
  17. 17. 従来のRの関数との対応入力/出力 arraydata.framelist なしarray apply adply alply a_plydata.framedaply aggregate by d_plylist sapply ldply lapply l_ply繰り返し(repeat)replicate rdply replicate r_ply関数引数(matrix)mapply mdply mapply m_ply17http://www.slideshare.net/hadley/04-wrapupより
  18. 18. パッケージの導入&読込> install.packages("plyr")trying URLhttp://cran.rstudio.com/bin/windows/contrib/3.0/plyr_1.8.zip……(途中省略)> #ライブラリの読み込み> library(plyr)18
  19. 19. データをざっとチェック> head(airquality)Ozone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 23 12 149 12.6 74 5 34 18 313 11.5 62 5 45 NA NA 14.3 56 5 56 28 NA 14.9 66 5 619
  20. 20. Misson 120私よ。すぐに月毎の平均気温を出して
  21. 21. ddply関数でやってみる> #名前を短くしておく> aq <- airquality> #月ごとの平均気温を出す> ddply(aq,"Month“,summarize,AveTemp=mean(Temp))Month AveTemp1 5 65.548392 6 79.10000………………………21
  22. 22. 忘れちゃいけないplyrの思想> #名前を短くしておく> aq <- airquality> #月ごとの平均気温を出す> ddply(aq,"Month“,summarize,AveTemp=mean(Temp))Month AveTemp1 5 65.548392 6 79.10000………………………22•Split(分割)•月(Month)毎に•Apply(適用)•気温(Temp)の平均を算出し•Combine(結合)•data.frameとして戻す
  23. 23. 月ごとの平均気温を出す2> #月ごとの平均気温2 with “.()”関数> ddply(aq, .(Month), summarize,AveTemp=mean(Temp))Month AveTemp1 5 65.548392 6 79.100003 7 83.903234 8 83.967745 9 76.9000023
  24. 24. • Excelだと…(既に目にくる)月ごとの平均気温を出す324
  25. 25. 複数の結果も算出可能> #複数の結果でもOK> ddply(aq, .(Month), summarize,AveTemp=mean(Temp), SdTemp=sd(Temp))Month AveTemp SdTemp1 5 65.54839 6.8548702 6 79.10000 6.5985893 7 83.90323 4.3155134 8 83.96774 6.5852565 9 76.90000 8.35567125
  26. 26. Misson 226あの男に連絡よっ!すぐに月毎の平均オゾン量を出させなきゃ…
  27. 27. 同じように…しかしデータにNAが> ddply(aq, .(Month), summarize,AveOzone=mean(Ozone))Month AveOzone1 5 NA2 6 NA3 7 NA4 8 NA5 9 NA27
  28. 28. meanにna.rm=TRUEを追加> ddply(aq, .(Month), summarize,AveOzone=mean(Ozone, na.rm=TRUE))Month AveOzone1 5 23.615382 6 29.444443 7 59.115384 8 59.961545 9 31.4482828
  29. 29. プログレスバーも導入可能> ddply(aq, .(Month), summarize,AveTemp=mean(Temp), .progress="text")|===============================| 100%Month AveTemp1 5 65.548392 6 79.100003 7 83.903234 8 83.967745 9 76.9000029
  30. 30. .parallel引数について• XYply系関数に.parallel引数が存在• 「重い…」とdisられるXYplyの救世主• 字面通り処理を並列化してくれる(私のwindows環境で動かせなかったので言及のみ…誰かはよ)30
  31. 31. Misson 331気温についてより細かく場合分けしたいわね…
  32. 32. transform:変数操作で列追加> #各月の平均気温以上の場合1、そうじゃないなら0となるフラグを追加> aq<-ddply(aq,.(Month),transform,HighTemp=ifelse(Temp-mean(Temp)>0,1,0))> aqOzone Solar.R Wind Temp Month Day HighTemp1 41 190 7.4 67 5 1 12 36 118 8.0 72 5 2 13 12 149 12.6 74 5 3 14 18 313 11.5 62 5 4 032
  33. 33. 月・平均気温毎の平均風速> #月・平均気温以上(以下)毎に平均風速を計算> ddply(aq, .(Month, HighTemp),summarize, AveWind=mean(Wind))Month HighTemp AveWind1 5 0 12.8000002 5 1 10.5187503 6 0 10.3833334 6 1 10.0916675 7 0 9.82000033
  34. 34. Misson 434ところでこのデータってどのくらい欠損値があった?
  35. 35. colwise:列毎への関数適用> #nmissing関数:欠損値の個数をカウント> nmissing<-function(x)sum(is.na(x))> #各列に対して関数を適用した結果を抽出> colwise(nmissing)(aq)Ozone Solar.R Wind Temp Month Day HighTemp1 37 7 0 0 0 0 0> #plyrなしの生のRで書くと↓となる> colSums(aq,is.na(aq))35
  36. 36. ddply + colwise = 強力> #月毎の各列の欠損値の個数> ddply(aq,.(Month),colwise(nmissing))Month Ozone Solar.R Wind Temp Day HighTemp1 5 5 4 0 0 0 02 6 21 0 0 0 0 03 7 5 0 0 0 0 04 8 5 3 0 0 0 05 9 1 0 0 0 0 036
  37. 37. 生Rで書くと…>miss.by.month<-by(aq,aq$Month,colwise(nmissing))>cbind(expand.grid(dimnames(miss.by.month)),do.call("rbind",miss.by.month))aq$Month Ozone Solar.R Wind Temp Month Day HighTemp5 5 5 4 0 0 0 0 06 6 21 0 0 0 0 0 07 7 5 0 0 0 0 0 08 8 5 3 0 0 0 0 09 9 1 0 0 0 0 0 037
  38. 38. Misson 538Excel野郎に分析させるから月毎にデータを全部csvで保存してくれ
  39. 39. d_ply:出力なしのddply> #月毎に分割したデータをファイルに保存> d_ply(aq, .(Month), function(x){+ month <- x$Month[1]+ write.csv(x,paste0("airquality_",month,".csv"))+ })39
  40. 40. 40plyr is Ready for Business
  41. 41. 41以下、その他便利関数紹介
  42. 42. rlply:指定回数繰り返し処理42> #オゾン量と気温の回帰分析を100ランダムサンプリングして実施する関数> f <-function(){lm(Ozone~Temp,aq[sample(nrow(aq),100,replace=TRUE),])}> #俗にいうブートストラップ> lms <- rlply(100, f)> #生Rで書くなら…lms <-lapply(1:100,function(i){f()})
  43. 43. rlply:指定回数繰り返し処理43> library(ggplot2)> qplot(laply(lms,function(x)coef(x)[2]), geom = "blank") ++geom_histogram(binwidth=0.2,aes(y= ..density..),fill="dodgerblue",colour="black")0.00.51.01.51.5 2.0 2.5 3.0 3.5laply(lms, function(x) coef(x)[2])density
  44. 44. mdply:引数として同一関数適用> #(平均・分散)={(1,1),(2,2),(3,3)}となるような正規分布に従う乱数をn=2個ずつ生成> mdply(data.frame(mean=1:3,sd=1:3),rnorm,n=2)mean sd V1 V21 1 1 0.9676560 2.1657062 2 2 5.2022971 3.4572683 3 3 0.3475657 -1.15128244
  45. 45. arrange:ソート> arrange(aq,Ozone)Ozone Solar.R Wind Temp Month Day HighTemp1 1 8 9.7 59 5 21 02 4 25 9.7 61 5 23 03 6 78 18.4 57 5 18 04 7 NA 6.9 74 5 11 15 7 48 14.3 80 7 15 0> #普通にRで書くならこんなかんじ> aq[with(aq,order(Ozone)),]45
  46. 46. arrange:ソート> #降順でのならべかえ> arrange(aq,desc(Ozone))Ozone Solar.R Wind Temp Month Day HighTemp1 168 238 3.4 81 8 25 02 135 269 4.1 84 7 1 13 122 255 4.0 89 8 7 14 118 225 2.3 94 8 29 15 115 223 5.7 79 5 30 16 110 207 8.0 90 8 9 146
  47. 47. arrange:ソート> #複数の列も指定可能> arrange(aq,Ozone,desc(Solar.R))Ozone Solar.R Wind Temp Month Day HighTemp1 1 8 9.7 59 5 21 02 4 25 9.7 61 5 23 03 6 78 18.4 57 5 18 04 7 49 10.3 69 9 24 05 7 48 14.3 80 7 15 06 7 NA 6.9 74 5 11 147
  48. 48. rbind.fill:欠損値補完付きrbind> df<-data.frame(Ozone=33.00)> rbind(aq,df)Error in rbind(deparse.level, ...) : 引数の列の数が一致しません> rbind.fill(aq,df)Ozone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 1.......153 20 223 11.5 68 9 30154 33 NA NA NA NA NA48
  49. 49. count:データ数勘定> #各月ごとに何個データあるか> count(aq,.(Month))Month freq1 5 312 6 303 7 314 8 315 9 30> #↓とほぼ同じ> ddply(aq,"Month",nrow)49
  50. 50. name_rows:行名保存&復元> # arrange等,plyrの関数は行名非保存> arrange(aq, Ozone)Ozone Solar.R Wind Temp Month Day1 1 8 9.7 59 5 212 4 25 9.7 61 5 233 6 78 18.4 57 5 184 7 NA 6.9 74 5 1150
  51. 51. name_rows:行名保存&復元> arrange(name_rows(aq), Ozone)Ozone Solar.R Wind Temp Month Day .rownames1 1 8 9.7 59 5 21 212 4 25 9.7 61 5 23 233 6 78 18.4 57 5 18 18> # 二回name_rowsを噛ませると行名保存されて出力> name_rows(arrange(name_rows(aq),Ozone))Ozone Solar.R Wind Temp Month Day21 1 8 9.7 59 5 2123 4 25 9.7 61 5 2318 6 78 18.4 57 5 1851
  52. 52. splat:同名の列処理> ozone.per.solar<-function(Ozone,Solar.R,...){Ozone/Solar.R}> head(aq,1)Ozone Solar.R Wind Temp Month Day HighTemp1 41 190 7.4 67 5 1 1> splat(ozone.per.solar)(aq[1,])[1] 0.2157895> splat(ozone.per.solar)(aq)[1] 0.21578947 0.30508475 0.08053 ……………52
  53. 53. round_any:値の丸め込み> # 10の位に丸め込み(1の位で四捨五入)> round_any(135,10)[1] 140> # 10の位に丸め込み(1の位で切り捨て)> round_any(135,10,floor)[1] 130> # 100の位に丸め込み(10の位で切り上げ)> round_any(135,100,ceiling)>[1] 20053
  54. 54. rename:列名の置換> # Ozone列をOooozoneという列名へ>rename(aq,replace=c(Ozone="Oooozone"))Oooozone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 23 12 149 12.6 74 5 34 18 313 11.5 62 5 45 NA NA 14.3 56 5 56 28 NA 14.9 66 5 654
  55. 55. mapvalues,revalue:値の置換> x <- c("a", "b", "c")> #a⇒AAA,c⇒CCCと変換。数値もいける>mapvalues(x,c("a“,"c"),c("AAA","CCC"))[1] "AAA" "b" "CCC"> #a⇒AAA,c⇒CCCと変換。文字・ファクター向き> revalue(x, c("a"="AAA","c"="CCC"))[1] "AAA" "b" "CCC"55
  56. 56. Happy debugging> #デバッグする時に便利な書き方> ddply(aq,.(Month),function(x)browser())Called from: .fun(piece, ...)Browse[1]> xOzone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 23 12 149 12.6 74 5 34 18 313 11.5 62 5 45 NA NA 14.3 56 5 556
  57. 57. Enjoy!!!57ぽんちん
  58. 58. 参考• H.Wickham氏の各種slide– http://www.slideshare.net/hadley/presentations• Stackoverflowの[plyr]tag– http://stackoverflow.com/questions/tagged/plyr• The Split-Apply-Combine Strategy for Data Analysis, H.Wickham– http://www.jstatsoft.org/v40/i01/paper58

×