ディレクトリのみ表示する。
t=dir()
t[file.info(t)$isdir]
1文にするなら
dir()[file.info(dir())$isdir]
こんな命令があった。
list.dirs(".",recursive = F)
参考https://stackoverflow.com/questions/4749783/how-to-obtain-a-list-of-directories-within-a-directory-like-list-files-but-i
2017年8月17日木曜日
R 関数を文字列で呼びだす
do.call("mean",list(1:10,na.rm=T))
第2引数は必ずリストで。これが関数への引数リストとなる。
eval((parse(text= "mean(1:10,na.rm=T)")))
関数に限らず文字列を実行したいとき。
第2引数は必ずリストで。これが関数への引数リストとなる。
eval((parse(text= "mean(1:10,na.rm=T)")))
関数に限らず文字列を実行したいとき。
2017年8月8日火曜日
R 練習問題
Rの練習問題を作ってみました。今回の対象は次のようなデータフレームです。試験の点数処理を題材としてみました。データを作るスクリプトです。乱数でとも思いましたが、同じ結果の方が見やすいでしょうから。
データはこんな風です。3組それぞれ5人の国・数・英の点数です。
問題と出力です。
#問1 dに個人ごとの計を付加
#問2 計順にソートして表示
#問3 dに計で学年順位を付加
#問4 組ごと計順に表示
#問5 教科間の相関係数
#問6 科目別箱髭図

#問7 国の組別箱髭図

#問8 教科集計
#問9 計の度数分布

#問10 科目別平均
#問11 計の組別平均
#問12 科目別組別平均
#問13 国の組別平均・最高・最低
#問14 国50未満を抽出
#問15 国50未満を抽出、組番国のみ表示
#問16 数40以上英50以上を抽出
#問17 数30以上を計順に表示
#問18 科目別、成績順、組番
#問19 計の20点刻み度数分布図

#問20 科目別5点刻み度数分布表
解答
終わりに
この練習問題では科目は横に展開し、組は縦に展開しているので、科目ごとと組ごとの扱いが違って来る。
apply系の命令をうまく使うことは難しい。この練習問題では、結構面白い使い方ができたと自負している。
簡単にポイントにふれておく。
問1 ①新たな列の付けくわえ方②d[3:5]はデータフレームdの3列目から5列目に限定している。データフレームはベクトルのリストであるので、d[3:5]で3列目から5列目が取り出される。これがmatrixならば、d[,3:5]とカンマとつけなければならない。もちろんデータフレームでもこのように指定してもよいが。③行集計にrowSumsを用いた。apply(d[3:5],1,sum)としてもよい。
問2 ①ソートにはorderを用いるのが良い。単一のベクトルをソートするにはsortを用いればよいが、キーでソートするようなときはorderがよい。orderは昇順にソートするので、高得点の方が先に来るように、マイナスした。desc=Tを用いてもよいが、おしゃれじゃない。②行番号で指定するので、d[order(-d$計),]と、コンマが必要となる。問1で述べたように、ここでコンマがないと、列の指定となってしまう。
問3 ①順位はrank。②引数のt=は ties.method = c("average", "first", "random", "max", "min")である。引数の変数名は誤解のない範囲で省略できる。
問4 orderでソート項目は並べればよい。
問5 特にない
問6 これだけで科目ごとの箱髭図を書いてくれるなんて、なんて便利なんだろう。
問7 組ごとの箱髭図はこう指定する。問6との違いは、先に述べたように、科目は横に展開し、組は縦に展開していること。
問8 特にない
問9 特にない
問10 d[3:5]がデータフレームなので、sapplyはリストの要素の各ベクトルすなわち各列に対して動作する。
問11 問10との違いは、前述のとおり
問12 applyの中でtapplyを使ってみた。うまくいった。sapplyでもいいのだね。
問13 いろいろと試行錯誤し、もっともよさげなものをあげた。
問14~17 抽出
問17 抽出と整列を同時にできないかというチャレンジ。一時変数を使わないでやりたかったが、最終的には用いてしまった。敗北感あり。使わない版もいくつか作ったが、同じ計算を2度やらせていて、許せない。いつの日か思いつくかもしれない。
問18 科目別のベストテンなどの表はよく作るだろう。それである。文字列ベクトルを作っておいて、その並び順を添え字で指定するというこのパターンは初めての経験かもしれない。
問19 breaksについては問20参照
問20 科目別度数分布表。苦労したのは、区間の指定。たとえば、breaks=c(10,20,30,40)とすると、この4つの数値によって、3つの区間に分けられる。10≦x≦20,20<x≦30,30<x≦40。最初の10の不等号に=が入っている
サンプルデータでは、回帰係数や回帰分析や、主成分分析、クラスタ分析も面白くなかろうと思ってやめた。
データはこんな風です。3組それぞれ5人の国・数・英の点数です。
問題と出力です。
#問1 dに個人ごとの計を付加
#問2 計順にソートして表示
#問3 dに計で学年順位を付加
#問4 組ごと計順に表示
#問5 教科間の相関係数
#問6 科目別箱髭図

#問7 国の組別箱髭図

#問8 教科集計
#問9 計の度数分布

#問10 科目別平均
#問11 計の組別平均
#問12 科目別組別平均
#問13 国の組別平均・最高・最低
#問14 国50未満を抽出
#問15 国50未満を抽出、組番国のみ表示
#問16 数40以上英50以上を抽出
#問17 数30以上を計順に表示
#問18 科目別、成績順、組番
#問19 計の20点刻み度数分布図

#問20 科目別5点刻み度数分布表
解答
終わりに
この練習問題では科目は横に展開し、組は縦に展開しているので、科目ごとと組ごとの扱いが違って来る。
apply系の命令をうまく使うことは難しい。この練習問題では、結構面白い使い方ができたと自負している。
簡単にポイントにふれておく。
問1 ①新たな列の付けくわえ方②d[3:5]はデータフレームdの3列目から5列目に限定している。データフレームはベクトルのリストであるので、d[3:5]で3列目から5列目が取り出される。これがmatrixならば、d[,3:5]とカンマとつけなければならない。もちろんデータフレームでもこのように指定してもよいが。③行集計にrowSumsを用いた。apply(d[3:5],1,sum)としてもよい。
問2 ①ソートにはorderを用いるのが良い。単一のベクトルをソートするにはsortを用いればよいが、キーでソートするようなときはorderがよい。orderは昇順にソートするので、高得点の方が先に来るように、マイナスした。desc=Tを用いてもよいが、おしゃれじゃない。②行番号で指定するので、d[order(-d$計),]と、コンマが必要となる。問1で述べたように、ここでコンマがないと、列の指定となってしまう。
問3 ①順位はrank。②引数のt=は ties.method = c("average", "first", "random", "max", "min")である。引数の変数名は誤解のない範囲で省略できる。
問4 orderでソート項目は並べればよい。
問5 特にない
問6 これだけで科目ごとの箱髭図を書いてくれるなんて、なんて便利なんだろう。
問7 組ごとの箱髭図はこう指定する。問6との違いは、先に述べたように、科目は横に展開し、組は縦に展開していること。
問8 特にない
問9 特にない
問10 d[3:5]がデータフレームなので、sapplyはリストの要素の各ベクトルすなわち各列に対して動作する。
問11 問10との違いは、前述のとおり
問12 applyの中でtapplyを使ってみた。うまくいった。sapplyでもいいのだね。
問13 いろいろと試行錯誤し、もっともよさげなものをあげた。
問14~17 抽出
問17 抽出と整列を同時にできないかというチャレンジ。一時変数を使わないでやりたかったが、最終的には用いてしまった。敗北感あり。使わない版もいくつか作ったが、同じ計算を2度やらせていて、許せない。いつの日か思いつくかもしれない。
問18 科目別のベストテンなどの表はよく作るだろう。それである。文字列ベクトルを作っておいて、その並び順を添え字で指定するというこのパターンは初めての経験かもしれない。
問19 breaksについては問20参照
問20 科目別度数分布表。苦労したのは、区間の指定。たとえば、breaks=c(10,20,30,40)とすると、この4つの数値によって、3つの区間に分けられる。10≦x≦20,20<x≦30,30<x≦40。最初の10の不等号に=が入っている
サンプルデータでは、回帰係数や回帰分析や、主成分分析、クラスタ分析も面白くなかろうと思ってやめた。
2017年2月19日日曜日
移動平均について
移動平均について考察してみる。なお、単純な移動平均についてである。
本日の終値を C0、前日の終値をC1、前々日の終値をC2、…と書く。
騰落率は C0/C1-1である。
5日移動平均MA5=(C0+C1+C2+C3+C4)/5である。
今、1日の騰落率が5日間ともrであったとしよう。すると、
C0 = C4×(1+r)^4 ≒ C4×(1+4r)
rが十分0に近いとき、(1+r)^n ≒ 1+nr であることを用いている。 今後これをどしどし使う。
同様に、C1≒C4×(1+3r)、C2≒C4×(1+2r)、C3≒C4×(1+r)、であるから、
MA5 ≒ C4×{(1+4r)+(1+3r)+(1+2r)+(1+r)+1}/5 ≒ C4×(1+2r) となる。
C0のMA5からの乖離率は、
C0/MA5-1 ≒ (1+4r)/(1+2r)-1
≒ (1+4r)(1-2r)-1
≒ 2r
すなわち、騰落率の2倍の値となる。逆に言えば、乖離率の2分の1が1日当たりの騰落率ということになる。
同様に、(25日移動平均からの乖離率)÷12 = 25日間の平均騰落率
(75日移動平均からの乖離率)÷37 = 75日間の平均騰落率
と考えることができる。
移動平均が右肩上がりならば、上昇トレンドにあると考えられる。しかし、チャートを比べて上昇の度合いを考えたいと思っても、チャートの縦の比率が一定ではないので、単純には比べられない。
移動平均曲線の傾きはどう求めたらよいだろうか。前述のMA5で調べてみる。
最終のMA5の傾きは、前日MA5と当日MA5の差である。
(MA5の傾き)=(当日MA5)-(前日MA5)
= (C0+C1+C2+C3+C4)/5-(C1+C2+C3+C4+C5)/5
= (C0-C5)/5
なんと、5日前との終値の差の5分の1である。途中の値は関係ないのだ。
C0-C5はモメンタムというらしい。
同様に、25日移動平均の最終日の傾きは、25日前との終値の差の25分の1となる。
ただの終値の差に、こんな意味があったとは!!
さて、実際には、株価が高いところでは当然その傾きも大きくなるのだから、比較のためには、
C5/C0-1の値を使うことになるであろう。この値はROC(rate of change)というらしい。
quantmodでは momentum(x, n = 1, na.pad = TRUE)
ROC(x, n = 1, type = c("continuous", "discrete", na.pad = TRUE)
となっている。上の計算と合わせるなら"discrete"である。
本日の終値を C0、前日の終値をC1、前々日の終値をC2、…と書く。
騰落率は C0/C1-1である。
5日移動平均MA5=(C0+C1+C2+C3+C4)/5である。
移動平均からの乖離率について
今、1日の騰落率が5日間ともrであったとしよう。すると、
C0 = C4×(1+r)^4 ≒ C4×(1+4r)
rが十分0に近いとき、(1+r)^n ≒ 1+nr であることを用いている。 今後これをどしどし使う。
同様に、C1≒C4×(1+3r)、C2≒C4×(1+2r)、C3≒C4×(1+r)、であるから、
MA5 ≒ C4×{(1+4r)+(1+3r)+(1+2r)+(1+r)+1}/5 ≒ C4×(1+2r) となる。
C0のMA5からの乖離率は、
C0/MA5-1 ≒ (1+4r)/(1+2r)-1
≒ (1+4r)(1-2r)-1
≒ 2r
すなわち、騰落率の2倍の値となる。逆に言えば、乖離率の2分の1が1日当たりの騰落率ということになる。
同様に、(25日移動平均からの乖離率)÷12 = 25日間の平均騰落率
(75日移動平均からの乖離率)÷37 = 75日間の平均騰落率
と考えることができる。
移動平均曲線の傾き
移動平均が右肩上がりならば、上昇トレンドにあると考えられる。しかし、チャートを比べて上昇の度合いを考えたいと思っても、チャートの縦の比率が一定ではないので、単純には比べられない。
移動平均曲線の傾きはどう求めたらよいだろうか。前述のMA5で調べてみる。
最終のMA5の傾きは、前日MA5と当日MA5の差である。
(MA5の傾き)=(当日MA5)-(前日MA5)
= (C0+C1+C2+C3+C4)/5-(C1+C2+C3+C4+C5)/5
= (C0-C5)/5
なんと、5日前との終値の差の5分の1である。途中の値は関係ないのだ。
C0-C5はモメンタムというらしい。
同様に、25日移動平均の最終日の傾きは、25日前との終値の差の25分の1となる。
ただの終値の差に、こんな意味があったとは!!
さて、実際には、株価が高いところでは当然その傾きも大きくなるのだから、比較のためには、
C5/C0-1の値を使うことになるであろう。この値はROC(rate of change)というらしい。
quantmodでは momentum(x, n = 1, na.pad = TRUE)
ROC(x, n = 1, type = c("continuous", "discrete", na.pad = TRUE)
となっている。上の計算と合わせるなら"discrete"である。
登録:
投稿 (Atom)