SlideShare a Scribd company logo
1 of 42
Download to read offline
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から⽇付
 – dim()      ディメンジョン
 – dimnames() 名前をつける


                            3
リストのapply




  ×      apply(list, 1:2, sum)

•リストは何でも詰められる
  •vector,data.frame,matrix,list何でも
  •ファイリングみたいなもの
•しかし、いきなりapplyはダメだった。
                                      4
リストのapply
• リストを串刺しにしてやりたい




                   5
練 習
                                                     > 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:3
x1 15 21                                             , , z3
x2 18 24        串刺し!           x  1:2                   y1 y2
                                                     x1  9 11
                                            c(1,3)       6
                                                     x2 10 12
                                      y
戦 略
1. unlist()
  – リストをベクター化
2. dim()
  – オブジェクトの次元を設定
3. dimnames()
  – オブジェクトの次元名を設定

                      7
実 際
• 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
準 備
• 東証のコードは?
 – 東証上場銘柄⼀覧
  • http://www.tse.or.jp/market/data/listed_companies/
 – エクセルで⼿に⼊る




                                                         9
東証上場銘柄⼀覧
• コードと社名の対をゲット
⽇付
コード
銘柄名
33業種コード
33業種区分
17業種コード
17業種区分
規模コード
規模区分

                 10
東証コードの読み込み
• エクセルからコピーして
code <‐ read.delim("clipboard")
                           # windowsの⽅

秘密:コードには".t"をつけないとダメ
code[,1] <‐ paste(code[,1], ".t", sep="")




                                            11
例「医薬品」
> 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
⼀気にいただく
• リストに格納
library(RFinanceYJ)
drug<‐list()
     #リストにxtsオブジェクトを
for(i in code[,1])
  drug[[i]]<‐quoteStockXtsData(i, 
  '2012‐01‐01')
 # これだけで1/1から今⽇までの株価をいただける
  リストdrugに医薬品銘柄37社の株価を詰める        13
想像してください
> head(drug[[1]])
           Open High Low Close  Volume Adjusted
2012‐01‐04  944  953 942   945 1100000      945
2012‐01‐05  945  948 933   940 1200000      940
2012‐01‐06  938  940 921   928  971000      928
2012‐01‐10  927  936 915   918 1075000      918
2012‐01‐11  915  915 904   912 1770000      912
2012‐01‐12  912  913 902   907 1273000      907
...

> class(drug[[1]])
[1] "xts" "zoo"

                         東証医薬品銘柄のリスト
                                                  14
条 件
• みな同じサイズでなくてはならない
  – ベクターにしてdimするので
     • 「練習」を思い出してください

> table(unlist(lapply(drug, NROW)))
127 133 134 135 ⾏数が揃っていない
  1   1   1  34
cnd<‐unlist(lapply(drug, NROW)==135
drug2<‐drug[cnd]

      135×6だけのテーブルを選ぶ(34銘柄)
      x:135,y:6,z:34 覚えておいて下さい        15
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]<‐"Adjusted"
• 銘柄名(z)
  z<‐names(code[,2][cnd])
                               18
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 Adjusted
2012‐01‐04 62854 63544 62272 62875 20776300    62875
2012‐01‐05 62776 63002 62244 62506 16002200    62506
2012‐01‐06 62465 62697 61728 61941 18870100    61941
2012‐01‐10 62196 62901 61773 62100 18066600    62100
2012‐01‐11 62166 62385 61595 62016 18269400    62016
2012‐01‐12 61776 61981 60980 61298 18377500    61298
...

                                                       21
グラフ
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]

            Last 68741

                                                                                                                          68000




                                                                                                                          66000




                                                                                                                          64000




                                                                                                                          62000




50
            Volume (millions):
40          22,635,200

30

20

                                                                                                                     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
まとめ
• リストにガンガンデータ格納
 – プログラミングの幅が広がる
 – 操作はその後からで⼤丈夫そう
• ベクトルにしてからお好きなように
• 勘で何となくできるようになるみたい




                      25
終わって...



「plyrでできるんじゃね?」

   ご⽰唆いただく
              2012.8.19追加
                       26
考えた
• 正確には指を動かした
• やっと思いついたのが
 – laply(list, "[")




                      27
結 論
• できた




              28
こんな感じ

• リストに行列を入れる          > lst
                      [[1]]
                              [,1] [,2] [,3]
                      [1,]    1    4    7


lst <‐ list()         [2,]    2    5    8
                      [3,]    3    6    9


mat<‐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
こいつに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
apply()で串刺し
> apply(laply(lst, "["), 2:3, sum)
  1  2  3             > lst
                      [[1]]

1 3 12 21                     [,1] [,2] [,3]
                      [1,]    1    4    7

2 6 15 24             [2,]    2    5    8
                      [3,]    3    6    9


3 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
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=1

drug3 <‐ laply(drug.sc, "[")

tmp <‐ drug[[1]] # dimnamesをつけるため0の⾏列を⽤意                 スッキリ!
tmp[] <‐ 0

drug4 <‐ tmp + apply(drug3, c(2, 3), sum)

                                                                 32
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
Height

                                                          0         5     10   15   20


                                                         大塚ホールディングス
                                                       生化学工業
                                    キョ ン製薬ホールディ
                                      ーリ       ングス
                                                         あすか製薬
                                                    キッ 薬品工業
                                                      セイ
                                                    ゼリア新薬工業
                                                                 大幸薬品
                                                              日医工
                                                              ツムラ
                                                      協和発酵キリン
                                                     大日本住友製薬
                                                       科研製薬
                                                        エーザイ
                                                       東和薬品
                                                       第一三共
                                                         日水製薬
                                                     小野薬品工業
                                                        鳥居薬品




  dist(drug3[, , 1])
                                                         富士製薬工業




hclust (*, "complete")
                                                         日本ケミ ァ
                                                             フ
                                                                                                              樹形図
                                                                                         Cluster Dendrogram




                                                       中外製薬
                                                         ダ ト
                                                          イ
                                                                 栄研化学
                                                              沢井製薬
                                                        日本新薬
                                                        持田製薬
                         3つぐらいのクラスタになっているようだ。




                                                               田辺三菱製薬
                                                     武田薬品工業
                                                      塩野義製薬
                                                    大正製薬ホールディングス
                         同じような株価の動きをするものがクラスタをつくる




                                                       アステラス製薬
                                                        久光製薬
                                                      扶桑薬品工業
     34
樹形図スクリプト
# 名前をつける
> 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
おまけ
• 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
さらに


パッケージ使わなくても
Reduce("+", lst, 0) でいけるんじゃないかと。




                   2012.8.21追加


                                 37
さらにさらに
• kos59125
 思いついちゃいました。微妙な違いですが演算
 ⼦を与える場合は普通の⽂字列 ("+") じゃなく
 てバッククォート (`+`) の⽅が良いみたいですね。
 ⽂字列を与えると対応する関数 (+) を探すのに
 微妙に時間がかかるようなので。

• 0 は初期値です。省略したら最初の要素になる
  みたいですね。この場合は省略できます。
                         38
Reduceで⼀発!
drug.sc <‐ lapply(drug2, scale)# scaleする(基準化)mean=0, SD=1

drug3 <‐ laply(drug.sc, "[")

tmp <‐ drug[[1]] # dimnamesをつけるため0の⾏列を⽤意
tmp[] <‐ 0

drug4 <‐ tmp + apply(drug3, c(2, 3), sum)




                   ↑これが1⾏になりました


                        Reduce(`+`, lapply(drug2, scale))

                                       エレガンツ!
                                                            39
                          dimnamesもとれない
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
とりあえずの総括
• リストの勉強になった

• plyrを使ってリストを配列にできた
 – 切り出しができるようになった
 – @dichika⽒に感謝

• リストの串刺しにはReduceで⼗分だった
 – ⼆項演算⼦が使える
 – @kos59125⽒に感謝


                          41
参 考
• 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
                                                               以上

More Related Content

Similar to Listを串刺し

Code iq×japanr 公開用
Code iq×japanr 公開用Code iq×japanr 公開用
Code iq×japanr 公開用
Nobuaki Oshiro
 
文字列曖昧検索によるマルウェアバイナリ解析
文字列曖昧検索によるマルウェアバイナリ解析文字列曖昧検索によるマルウェアバイナリ解析
文字列曖昧検索によるマルウェアバイナリ解析
Preferred Networks
 

Similar to Listを串刺し (20)

Japan r.3
Japan r.3Japan r.3
Japan r.3
 
Rによる分類木 入門
Rによる分類木 入門Rによる分類木 入門
Rによる分類木 入門
 
Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~
 
Bee Style:vol.039
Bee Style:vol.039Bee Style:vol.039
Bee Style:vol.039
 
Gurobi python
Gurobi pythonGurobi python
Gurobi python
 
Tokyo r27
Tokyo r27Tokyo r27
Tokyo r27
 
Code iq×japanr 公開用
Code iq×japanr 公開用Code iq×japanr 公開用
Code iq×japanr 公開用
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
how to defend DNS authoritative server against DNS WaterTorture
how to defend DNS authoritative server against DNS WaterTorturehow to defend DNS authoritative server against DNS WaterTorture
how to defend DNS authoritative server against DNS WaterTorture
 
RでGIS
RでGISRでGIS
RでGIS
 
R's anti sparseness
R's anti sparsenessR's anti sparseness
R's anti sparseness
 
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法
 
計算機理論入門09
計算機理論入門09計算機理論入門09
計算機理論入門09
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101
 
データ処理
データ処理データ処理
データ処理
 
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
姫路 IT 系勉強会 Vol.6 プログラミングコンテストという名のオンラインゲームがあるらしい
 
文字列曖昧検索によるマルウェアバイナリ解析
文字列曖昧検索によるマルウェアバイナリ解析文字列曖昧検索によるマルウェアバイナリ解析
文字列曖昧検索によるマルウェアバイナリ解析
 
Verilog-HDL Tutorial (4)
Verilog-HDL Tutorial (4)Verilog-HDL Tutorial (4)
Verilog-HDL Tutorial (4)
 
[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...
[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...
[db tech showcase Tokyo 2015] A14:Amazon Redshiftの元となったスケールアウト型カラムナーDB徹底解説 その...
 

More from Yoshiteru Kamiyama

More from Yoshiteru Kamiyama (7)

オイラーの公式で感じる次元の呪い
オイラーの公式で感じる次元の呪いオイラーの公式で感じる次元の呪い
オイラーの公式で感じる次元の呪い
 
Tokyo.rの輪
Tokyo.rの輪Tokyo.rの輪
Tokyo.rの輪
 
R language definition3.1_3.2
R language definition3.1_3.2R language definition3.1_3.2
R language definition3.1_3.2
 
rで踊るパスタ
rで踊るパスタrで踊るパスタ
rで踊るパスタ
 
Rでマンデルブロ集合
Rでマンデルブロ集合Rでマンデルブロ集合
Rでマンデルブロ集合
 
黄金比.再帰
黄金比.再帰黄金比.再帰
黄金比.再帰
 
医療費ts
医療費ts医療費ts
医療費ts
 

Listを串刺し