O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
listを串刺し            manozo         Tokyo.R#25 LT           2012.8.4  付け⾜し2012.8.19(@dichika⽒に感謝)さらに付け⾜し2012.8.21(@kos59125...
リストを串刺したい• ネットで検索するも⾒つからず – 「Rのリストを串刺し」• RjpWikiに質問しようとしたが...• 考えてみた                         2
リストを串刺したい• 材料(順不同) – unlist() リストをベクトル化 – apply()    要素に対して関数を適⽤ – NROW()     ⾏数を得る – lapply() リストのapply – index()    xtsか...
リストのapply  ×      apply(list, 1:2, sum)•リストは何でも詰められる  •vector,data.frame,matrix,list何でも  •ファイリングみたいなもの•しかし、いきなりapplyはダメだった...
リストのapply• リストを串刺しにしてやりたい                   5
練 習                                                     > a                                                     , , z1> (a...
戦 略1. unlist()  – リストをベクター化2. dim()  – オブジェクトの次元を設定3. dimnames()  – オブジェクトの次元名を設定                      7
実 際• library(RFinanceYJ)を使う  – Tokyo.R勉強会の主催者作  – 某サイトから株価を抜くすばらしい    ライブラリ• library(quantmod)  – ロウソク⾜とか描けるライブラリ• 医薬品銘柄の株...
準 備• 東証のコードは? – 東証上場銘柄⼀覧  • http://www.tse.or.jp/market/data/listed_companies/ – エクセルで⼿に⼊る                                ...
東証上場銘柄⼀覧• コードと社名の対をゲット⽇付コード銘柄名33業種コード33業種区分17業種コード17業種区分規模コード規模区分                 10
東証コードの読み込み• エクセルからコピーしてcode <‐ read.delim("clipboard")                           # windowsの⽅秘密:コードには".t"をつけないとダメcode[,1] <...
例「医薬品」> code   コード                           銘柄名1  4151.t                 協和発酵キリン2  4502.t                   武⽥薬品⼯業3  4503...
⼀気にいただく• リストに格納library(RFinanceYJ)drug<‐list()     #リストにxtsオブジェクトをfor(i in code[,1])  drug[[i]]<‐quoteStockXtsData(i,   20...
想像してください> head(drug[[1]])           Open High Low Close  Volume Adjusted2012‐01‐04  944  953 942   945 1100000      945201...
条 件• みな同じサイズでなくてはならない  – ベクターにしてdimするので     • 「練習」を思い出してください> table(unlist(lapply(drug, NROW)))127 133 134 135 ⾏数が揃っていない  ...
unlistしてベクトル化drug.un<‐unlist(drug2)                         16
dim()を設定dim(drug.un) <‐ c(135, 6, 34)                                17
dimnames()の準備• ⽇付(x)  date<‐index(drug[[1]])  x<‐as.character(date)• カラム名(y)  y<‐colnames(drug[[1]])     names(y)[6]<‐"Adj...
dimnames()の設定• まとめて名札つけdimnames(drug.un)<‐list(x, y, z)                                   19
串刺し!apply(drug.un, 1:2, sum)                           20
34銘柄を串刺し(合計)> head(apply(drug.un,1:2,sum))           Open  High   Low Close   Volume Adjusted2012‐01‐04 62854 63544 62272 ...
グラフlibrary(quantmod)candleChart(apply(drug.un, 1:2, sum))                                        22
apply(apply(a, 1:2, sum), 1:2, sum)                                                      [2012-01-04/2012-07-18]          ...
お断り• 株についてはド素⼈ – 合計してどんな意味があるか知らない – あくまでも練習 – 経済学は学んだことがない                       24
まとめ• リストにガンガンデータ格納 – プログラミングの幅が広がる – 操作はその後からで⼤丈夫そう• ベクトルにしてからお好きなように• 勘で何となくできるようになるみたい                      25
終わって...「plyrでできるんじゃね?」   ご⽰唆いただく              2012.8.19追加                       26
考えた• 正確には指を動かした• やっと思いついたのが – laply(list, "[")                      27
結 論• できた              28
こんな感じ• リストに行列を入れる          > lst                      [[1]]                              [,1] [,2] [,3]                   ...
こいつにlaply()• 配列にする            > laply(lst,"[")                   , , 1 laply(lst, "[")        1 2 3                   [1,]...
apply()で串刺し> apply(laply(lst, "["), 2:3, sum)  1  2  3             > lst                      [[1]]1 3 12 21              ...
laplyを使ってもう⼀度#ライブラリーのロードlibrary(RFinanceYJ)library(quantmod)# 銘柄コードで株価をget!for(i in code[,1])  drug[[i]] <‐ quoteStockXtsD...
drug4 > head(drug4)                 Open       High       Low     Close      Volume  AdjClose 2012‐01‐04 ‐11.11693  ‐8.891...
Height                                                          0         5     10   15   20                              ...
樹形図スクリプト# 名前をつける> dimnames(drug3)[[1]] <‐ names(drug2)> dimnames(drug3)[[2]] <‐ as.character(index(drug2[[1]]))# 樹形図を描く> p...
おまけ• xtsExtraライブラリを使って# 画⾯に表⽰しきれないのでpdfにpdf("open.pdf", w=8, h=20, family="Japan1GothicBBB")plot.xts(t(drug3[,,1]))dev.off...
さらにパッケージ使わなくてもReduce("+", lst, 0) でいけるんじゃないかと。                   2012.8.21追加                                 37
さらにさらに• kos59125 思いついちゃいました。微妙な違いですが演算 ⼦を与える場合は普通の⽂字列 ("+") じゃなく てバッククォート (`+`) の⽅が良いみたいですね。 ⽂字列を与えると対応する関数 (+) を探すのに 微妙に時...
Reduceで⼀発!drug.sc <‐ lapply(drug2, scale)# scaleする(基準化)mean=0, SD=1drug3 <‐ laply(drug.sc, "[")tmp <‐ drug[[1]] # dimnames...
Reduceのイメージ• Rubyでいうとinject – reduceはinjectのエイリアス – [1, 2, 3, 4, 5].inject(:+) # => 15      +  +  +  + 間に差し込む感じ•R pstp <‐ ...
とりあえずの総括• リストの勉強になった• plyrを使ってリストを配列にできた – 切り出しができるようになった – @dichika⽒に感謝• リストの串刺しにはReduceで⼗分だった – ⼆項演算⼦が使える – @kos59125⽒に感...
参 考• Rパッケージガイドブック  – RfinanceYJ, plyrパッケージの解説あり  – http://www.tokyo‐tosho.co.jp/books/ISBN978‐4‐489‐02097‐1.html• Rfinance...
Próximos SlideShares
Carregando em…5
×

Listを串刺し

  • Seja o primeiro a comentar

Listを串刺し

  1. 1. listを串刺し manozo Tokyo.R#25 LT 2012.8.4 付け⾜し2012.8.19(@dichika⽒に感謝)さらに付け⾜し2012.8.21(@kos59125⽒に感謝)
  2. 2. リストを串刺したい• ネットで検索するも⾒つからず – 「Rのリストを串刺し」• RjpWikiに質問しようとしたが...• 考えてみた 2
  3. 3. リストを串刺したい• 材料(順不同) – unlist() リストをベクトル化 – apply() 要素に対して関数を適⽤ – NROW() ⾏数を得る – lapply() リストのapply – index() xtsから⽇付 – dim() ディメンジョン – dimnames() 名前をつける 3
  4. 4. リストのapply × apply(list, 1:2, sum)•リストは何でも詰められる •vector,data.frame,matrix,list何でも •ファイリングみたいなもの•しかし、いきなりapplyはダメだった。 4
  5. 5. リストのapply• リストを串刺しにしてやりたい 5
  6. 6. 練 習 > a , , z1> (a<‐1:12) #①ベクトル [1]  1  2  3  4  5  6  7  8  9 10 11 12 y1 y2> dim(a)<‐c(2, 2, 3) #②ディメンジョン x1  1  3> dimnames(a)<‐list(c("x1", "x2"), #③名札をつける x2  2  4 c("y1", "y2"), c("z1", "z2", "z3")) , , z2 y1 y2> apply(a, 1:2, sum) #x:1, y:2, z:3 x1  5  7 z x2  6  8 y1 y2 2:3x1 15 21 , , z3x2 18 24 串刺し! x 1:2 y1 y2 x1  9 11 c(1,3) 6 x2 10 12 y
  7. 7. 戦 略1. unlist() – リストをベクター化2. dim() – オブジェクトの次元を設定3. dimnames() – オブジェクトの次元名を設定 7
  8. 8. 実 際• library(RFinanceYJ)を使う – Tokyo.R勉強会の主催者作 – 某サイトから株価を抜くすばらしい ライブラリ• library(quantmod) – ロウソク⾜とか描けるライブラリ• 医薬品銘柄の株価を抜いてscaleして a[, , x["持田製薬"]] Last 891 [2012-01-04/2012-07-18] sumしてみる 950 900 850 25 Volume (10,000s): 20 188,000 15 10 5 1 04 2012 1 31 2012 2 21 2012 3 13 2012 4 03 2012 4 24 2012 5 22 2012 8 6 12 2012 7 03 2012
  9. 9. 準 備• 東証のコードは? – 東証上場銘柄⼀覧 • http://www.tse.or.jp/market/data/listed_companies/ – エクセルで⼿に⼊る 9
  10. 10. 東証上場銘柄⼀覧• コードと社名の対をゲット⽇付コード銘柄名33業種コード33業種区分17業種コード17業種区分規模コード規模区分 10
  11. 11. 東証コードの読み込み• エクセルからコピーしてcode <‐ read.delim("clipboard") # windowsの⽅秘密:コードには".t"をつけないとダメcode[,1] <‐ paste(code[,1], ".t", sep="") 11
  12. 12. 例「医薬品」> code コード 銘柄名1  4151.t                 協和発酵キリン2  4502.t                   武⽥薬品⼯業3  4503.t                 アステラス製薬4  4506.t                 ⼤⽇本住友製薬5  4507.t                     塩野義製薬6  4508.t                   ⽥辺三菱製薬7  4512.t                   わかもと製薬8  4514.t                     あすか製薬9  4516.t                       ⽇本新薬10 4519.t                       中外製薬 > NROW(code) [1] 36 12
  13. 13. ⼀気にいただく• リストに格納library(RFinanceYJ)drug<‐list() #リストにxtsオブジェクトをfor(i in code[,1]) drug[[i]]<‐quoteStockXtsData(i,  2012‐01‐01) # これだけで1/1から今⽇までの株価をいただける リストdrugに医薬品銘柄37社の株価を詰める 13
  14. 14. 想像してください> head(drug[[1]]) Open High Low Close  Volume Adjusted2012‐01‐04  944  953 942   945 1100000      9452012‐01‐05  945  948 933   940 1200000      9402012‐01‐06  938  940 921   928  971000      9282012‐01‐10  927  936 915   918 1075000      9182012‐01‐11  915  915 904   912 1770000      9122012‐01‐12  912  913 902   907 1273000      907...> class(drug[[1]])[1] "xts" "zoo" 東証医薬品銘柄のリスト 14
  15. 15. 条 件• みな同じサイズでなくてはならない – ベクターにしてdimするので • 「練習」を思い出してください> table(unlist(lapply(drug, NROW)))127 133 134 135 ⾏数が揃っていない 1   1   1  34cnd<‐unlist(lapply(drug, NROW)==135drug2<‐drug[cnd] 135×6だけのテーブルを選ぶ(34銘柄) x:135,y:6,z:34 覚えておいて下さい 15
  16. 16. unlistしてベクトル化drug.un<‐unlist(drug2) 16
  17. 17. dim()を設定dim(drug.un) <‐ c(135, 6, 34) 17
  18. 18. dimnames()の準備• ⽇付(x) date<‐index(drug[[1]]) x<‐as.character(date)• カラム名(y) y<‐colnames(drug[[1]]) names(y)[6]<‐"Adjusted"• 銘柄名(z) z<‐names(code[,2][cnd]) 18
  19. 19. dimnames()の設定• まとめて名札つけdimnames(drug.un)<‐list(x, y, z) 19
  20. 20. 串刺し!apply(drug.un, 1:2, sum) 20
  21. 21. 34銘柄を串刺し(合計)> head(apply(drug.un,1:2,sum)) Open  High   Low Close   Volume Adjusted2012‐01‐04 62854 63544 62272 62875 20776300    628752012‐01‐05 62776 63002 62244 62506 16002200    625062012‐01‐06 62465 62697 61728 61941 18870100    619412012‐01‐10 62196 62901 61773 62100 18066600    621002012‐01‐11 62166 62385 61595 62016 18269400    620162012‐01‐12 61776 61981 60980 61298 18377500    61298... 21
  22. 22. グラフlibrary(quantmod)candleChart(apply(drug.un, 1:2, sum)) 22
  23. 23. apply(apply(a, 1:2, sum), 1:2, sum) [2012-01-04/2012-07-18] Last 68741 68000 66000 64000 6200050 Volume (millions):40 22,635,2003020 23 1 04 2012 1 31 2012 2 21 2012 3 13 2012 4 03 2012 4 24 2012 5 22 2012 6 12 2012 7 03 2012
  24. 24. お断り• 株についてはド素⼈ – 合計してどんな意味があるか知らない – あくまでも練習 – 経済学は学んだことがない 24
  25. 25. まとめ• リストにガンガンデータ格納 – プログラミングの幅が広がる – 操作はその後からで⼤丈夫そう• ベクトルにしてからお好きなように• 勘で何となくできるようになるみたい 25
  26. 26. 終わって...「plyrでできるんじゃね?」 ご⽰唆いただく 2012.8.19追加 26
  27. 27. 考えた• 正確には指を動かした• やっと思いついたのが – laply(list, "[") 27
  28. 28. 結 論• できた 28
  29. 29. こんな感じ• リストに行列を入れる > lst [[1]] [,1] [,2] [,3] [1,]    1    4    7lst <‐ list() [2,]    2    5    8 [3,]    3    6    9mat<‐matrix(1:9, 3) [[2]] [,1] [,2] [,3]for(i in 1:3) [1,]    1    4    7 [2,]    2    5    8  lst[[i]] <‐ mat [3,]    3    6    9 [[3]] [,1] [,2] [,3] [1,]    1    4    7 [2,]    2    5    8 [3,]    3    6    9 29
  30. 30. こいつにlaply()• 配列にする > laply(lst,"[") , , 1 laply(lst, "[") 1 2 3 [1,] 1 2 3 [2,] 1 2 3 [3,] 1 2 3 , , 2 1 2 3 [1,] 4 5 6 [2,] 4 5 6 [3,] 4 5 6 , , 3 1 2 3 [1,] 7 8 9 [2,] 7 8 9 [3,] 7 8 9 30
  31. 31. apply()で串刺し> apply(laply(lst, "["), 2:3, sum) 1  2  3 > lst [[1]]1 3 12 21 [,1] [,2] [,3] [1,]    1    4    72 6 15 24 [2,]    2    5    8 [3,]    3    6    93 9 18 27  [[2]] [,1] [,2] [,3] [1,]    1    4    7 [2,]    2    5    8 めでたくsumになっている [3,]    3    6    9 [[3]] [,1] [,2] [,3] [1,]    1    4    7 [2,]    2    5    8 [3,]    3    6    9 31
  32. 32. laplyを使ってもう⼀度#ライブラリーのロードlibrary(RFinanceYJ)library(quantmod)# 銘柄コードで株価をget!for(i in code[,1]) drug[[i]] <‐ quoteStockXtsData(i, 2012‐01‐01)cnd <‐ lapply(drug,NROW)#条件drug2 <‐ drug[cnd == max(unlist(cnd))]# ⾏数すなわち⽇数が同じもので揃える(155⽇分)drug.sc<‐lapply(drug2,scale)# scaleする(基準化)mean=0, SD=1drug3 <‐ laply(drug.sc, "[")tmp <‐ drug[[1]] # dimnamesをつけるため0の⾏列を⽤意 スッキリ!tmp[] <‐ 0drug4 <‐ tmp + apply(drug3, c(2, 3), sum) 32
  33. 33. drug4 > head(drug4) Open       High       Low     Close      Volume  AdjClose 2012‐01‐04 ‐11.11693  ‐8.891408 ‐10.94261  ‐9.86077   0.2462292  ‐9.86077 2012‐01‐05 ‐10.86592 ‐13.342024 ‐11.06719 ‐13.14939 ‐18.8736414 ‐13.14939 2012‐01‐06 ‐13.80675 ‐16.476652 ‐16.55394 ‐18.72217 ‐13.2619929 ‐18.72217 2012‐01‐10 ‐16.88440 ‐15.568659 ‐16.44554 ‐17.52046 ‐12.5594417 ‐17.52046 2012‐01‐11 ‐16.64755 ‐19.320562 ‐16.82423 ‐17.96469 ‐18.4883136 ‐17.96469 2012‐01‐12 ‐20.46076 ‐23.494666 ‐24.94043 ‐26.42570 ‐10.0137024 ‐26.42570 > names(drug4)[6] [1] "AdjClose" > names(drug4)[6]<‐"Adjusted" > candleChart(drug4)4⽉に薬価引き下げがあるものの6⽉には復帰 33
  34. 34. Height 0 5 10 15 20 大塚ホールディングス 生化学工業 キョ ン製薬ホールディ ーリ ングス あすか製薬 キッ 薬品工業 セイ ゼリア新薬工業 大幸薬品 日医工 ツムラ 協和発酵キリン 大日本住友製薬 科研製薬 エーザイ 東和薬品 第一三共 日水製薬 小野薬品工業 鳥居薬品 dist(drug3[, , 1]) 富士製薬工業hclust (*, "complete") 日本ケミ ァ フ 樹形図 Cluster Dendrogram 中外製薬 ダ ト イ 栄研化学 沢井製薬 日本新薬 持田製薬 3つぐらいのクラスタになっているようだ。 田辺三菱製薬 武田薬品工業 塩野義製薬 大正製薬ホールディングス 同じような株価の動きをするものがクラスタをつくる アステラス製薬 久光製薬 扶桑薬品工業 34
  35. 35. 樹形図スクリプト# 名前をつける> dimnames(drug3)[[1]] <‐ names(drug2)> dimnames(drug3)[[2]] <‐ as.character(index(drug2[[1]]))# 樹形図を描く> plot(hclust(dist(drug3[,,1]))) #↑Open> dimnames(drug3)[[3]][1] "Open" "High"  "Low"  "Close"  "Volume" "AdjClose"株価に関係なく値動きだけが近いものがクラスタをつくる(近いクラスタのものはどちらか売るとリスクヘッジ?) 35
  36. 36. おまけ• xtsExtraライブラリを使って# 画⾯に表⽰しきれないのでpdfにpdf("open.pdf", w=8, h=20, family="Japan1GothicBBB")plot.xts(t(drug3[,,1]))dev.off()• 株価のヒストグラム# 株価は正規分布する?hist(drug3[,,1], freq=F, ylim=c(0, 0.4))plot(dnorm, xlim=c(‐3, 3), add=T, col=2) 36
  37. 37. さらにパッケージ使わなくてもReduce("+", lst, 0) でいけるんじゃないかと。 2012.8.21追加 37
  38. 38. さらにさらに• kos59125 思いついちゃいました。微妙な違いですが演算 ⼦を与える場合は普通の⽂字列 ("+") じゃなく てバッククォート (`+`) の⽅が良いみたいですね。 ⽂字列を与えると対応する関数 (+) を探すのに 微妙に時間がかかるようなので。• 0 は初期値です。省略したら最初の要素になる みたいですね。この場合は省略できます。 38
  39. 39. Reduceで⼀発!drug.sc <‐ lapply(drug2, scale)# scaleする(基準化)mean=0, SD=1drug3 <‐ laply(drug.sc, "[")tmp <‐ drug[[1]] # dimnamesをつけるため0の⾏列を⽤意tmp[] <‐ 0drug4 <‐ tmp + apply(drug3, c(2, 3), sum) ↑これが1⾏になりました Reduce(`+`, lapply(drug2, scale)) エレガンツ! 39 dimnamesもとれない
  40. 40. Reduceのイメージ• Rubyでいうとinject – reduceはinjectのエイリアス – [1, 2, 3, 4, 5].inject(:+) # => 15 +  +  +  + 間に差し込む感じ•R pstp <‐ function(x, y)paste(x, y, sep="+") Reduce(pstp, 1:5) [1] "1+2+3+4+5" pasteして eval(parse(text=Reduce(pstp, 1:5))) [1] 15 エバっみる 40
  41. 41. とりあえずの総括• リストの勉強になった• plyrを使ってリストを配列にできた – 切り出しができるようになった – @dichika⽒に感謝• リストの串刺しにはReduceで⼗分だった – ⼆項演算⼦が使える – @kos59125⽒に感謝 41
  42. 42. 参 考• Rパッケージガイドブック – RfinanceYJ, plyrパッケージの解説あり – http://www.tokyo‐tosho.co.jp/books/ISBN978‐4‐489‐02097‐1.html• RfinanceYJ – http://www.okada.jp.org/RWiki/?RFinanceYJ%A5%B5%A5%F3%A5%D7%A5%EB – http://d.hatena.ne.jp/yokkuns/20110324/1300922162• plyrパッケージの使い⽅メモ – http://d.hatena.ne.jp/teramonagi/20120806/1344255419• quantmod – youtubeあり – http://www.youtube.com/watch?v=byymvwQye7E 42 以上

×