R – 因子型(Factor型)

準備

以下のように文字列型のベクトルを準備。

因子型への変換

factor()関数を使って因子型へ返還。このとき因子の順番はシステムで自動的に割り振られ、ソートするとその順番で並べ替えられる。

因子を指定した要素の抽出

要素の抽出は因子のラベルを指定して行う。
因子のオーダでの指定はできない。

因子の順序の指定

factor()関数のlevels指定で明示的に因子の順序を指定できる。

因子の大小関係の指定

上記のベクトルyやzの各因子は順序関係を持っているが、それらは順序については特定できるが大小判定は行えない。

大小判定可能な値とするにはordered()関数を通す必要がある。

Factorベクトルの新規生成

一つ目の要素を定義する場合

通常紹介されている方法は、文字列型などのベクトルがあらかじめ準備されていて、それをFactor型に変換するというもの。

一つ目の要素を定義して、以降付け足していきたい場合は以下のようにする。

またlevelsを指定しないと、初期値以外はNAとなって警告が出る。

またlevelsで指定した以外のラベルを指定するとNAとなり、最初の要素は無視され、その後追加しようとした要素はNAとして保存される。

要素数ゼロから定義する場合

最初からFactor型のベクトルを定義してゼロから要素を追加するには、以下のようにするとよい。

下記の例では、factor()関数の第1引数に仮のベクトルをnumeric(0)で与えているが、character(0)でも同じ結果となり、単なるプレースホルダとなっているらしい。

データフレーム生成の場合の因子化について

データフレーム生成時に、文字列型ベクトルが自動的に因子型に変換される。これを抑止する方法についてはこちらを参照。

 

R – 画面表示

オブジェクトの直接表示

オブジェクトを直接入力すると、その内容が表示される。

スクリプトファイルでも行頭にオブジェクトを書くと、その行の実行時点でオブジェクトの内容が表示される。

ただし条件判断やループの場合は、文でもブロックでも表示はされない。

例えば以下のスクリプトの場合、

表示されるのは1行目だけ。

print()~一般的な表示

オブジェクトの内容をそのまま表示する。

デフォルトでは文字列が””で囲われるが、quote=Fを指定すると””が表示されなくなる。

page()~別ウィンドウでの表示

page()関数ごとに別ウィンドウが立ち上がり、オブジェクトが表示される。大量のデータを表示するときに便利。

デフォルトではmethod="dput"が指定され、オブジェクトの定義表現が表示される。

オブジェクトの内容を表示するときは、明示的にmethod="print"を指定する。

1つ目のpage()関数で別ウィンドウが立ち上がり、以下のように表示される。

2つ目のpage()関数で2つ目の別ウィンドウが立ち上がり、以下のように表示される。

cat()~文字列の表示

cat()関数は、括弧内の文字列をそのまま出力する。

catは最後に改行をつけないので、改行させたい時は”\n”を付ける。

 

str()~オブジェクト情報付き表示

要約されたオブジェクトの情報を付けて内容を表示する。

summary()~データの要約を表示する。

オブジェクトの内容に応じた要約情報を表示する。

summaryは特に統計データの要約に重要。たとえば▲データフレームの集計▲を参照。

 

 

R – データフレームの参照・変更

データフレーム全体の参照

データフレームの名前そのもので、データフレームの内容を参照できる。列名(name, age)や項目名(“1″~”3”)も含めて参照される。

データフレームの行数・列数の参照

nrow()関数、ncol()関数でデータフレームの行数、列数を参照できる。dim()関数は(行数, 列数)のベクトルを返す。

データフレームの内容の参照・変更

列名・項目名の参照・変更

列名はnames()関数かcolnames()関数で、項目名はrownames()関数で取得できる。

列名や項目名は、それぞれの参照関数にベクトルを代入することで変更できる。

データフレームの要素の参照・変更

行・列を直接指定して参照する場合、列の場合は列名を指定するか列番号で、行の場合は行番号を指定して参照する。行・列の番号を指定して1つのデータを取得することもできる。

行番号を指定する場合は後ろに、列番号を指定する場合は前に”,”をつける必要があり、これは後述の行の抽出の場合に重要になる。

なお、参照した要素の右に代入文を書くことで、その要素や業・列の内容を変更できる。

行・列の追加と削除

行・列の追加

行の追加はrbind()関数で、列の追加はcbind()関数で行う。

これらの関数は元のデータフレームを変更せず、新たなデータフレームを結果として返す。

rbindの注意点として、文字型を意図した項目はあらかじめFactor型から文字型に変更しておかないと、文字列を含んだデータを結合しようとするとエラーになる。

cbindの注意点としては、デフォルトでは引数の変数名が項目名にあてられる。直接c(…)と書いたりすると、それがそのまま項目名になってしまう。

【追記】 以下の例ではrbindの引数にベクトルを渡しているが、文字列と数値が混在している下記のような例では、これは危ない→rbindについてを参照

行・列の削除

行や列の番号を指定して削除する場合は、番号にマイナスをつける。範囲指定も可能。

行・列の追加と同じく、これらの操作も元のデータフレームを変更せず、新たなデータフレームを結果として返す。

データの抽出

列項目の条件を指定して、要素を抽出することができる。

指定の条件の後に”,”をつけるのを忘れないこと。これは行要素に対して条件指定していることを表している。

抽出操作はもとのデータフレームに影響を与えず、結果は新たなデータフレームとして返される。

 

R – データフレームの集計

summary()関数で、データ全体の集計が行える。

by()関数によって、特定のデータの層別に集計することができる。

もちろん、個別の数値データについて各種代表値を計算することもできる。

 

 

R – データフレームの列の非因子化

ベクトルから生成する場合

データフレームを複数のベクトルから生成する場合、文字列のベクトルがFactor型(因子型)になってしまう。

これを文字型に直すのに、以下の3つの方法がある。

as.charactor()関数

as.charactor()関数で指定した列がcharacter化されるので、それを元の列に代入。

levels()関数

仕組みはよくわかっていない。

transform()関数

データフレーム全体に適用。

ファイルから読み込む場合

ファイルから読み込んだ後に上記の操作を行ってもよいが、読み込み時にFactor型への変換を抑止するため、引数にstringsAsFactors = Fを指定する方法もある。

個の引数指定は、read.table、read.delimread.csvの何れでも指定できる。

 

 

R – データフレームの生成

ベクトル列から生成する方法

同じ長さのベクトルを各列として、データフレームを生成可能。

上記の結果は以下の通り。

ファイルからの読み込み

通常、作業ディレクトリかその下にあるディレクトリにあるファイルを扱う。扱いやすいのはタブ区切りテキスト、CSV。

read.tableによる方法

TAB区切り/ヘッダなし

read.tableでそのまま読み込む。項目名はRが勝手につけてくれる。

デフォルトでTABが区切り文字になってるが、明示する場合は引数にsep="\t"を追加。

CSV/ヘッダなし

read.tableで引数にsep=","を付けて読み込む。

TAB区切り/ヘッダあり

read.tableheader=Tを付けて読み込む。sep="\t"を指定してもよい。

この形式の場合、wrapperクラスのread.delimでファイルのみ指定して読み込める。

CSV/ヘッダあり

read.tablesep=","header=Tを指定して読み込む。

この形式の場合、wrapperクラスのread.csvでファイルのみ指定して読み込める。

注意点:Factor型への自動変換

ベクトルからの生成にしても、ファイルからの読み込みにしても、文字列のデータを持ったベクトルをデータフレームに取り込むと、自動的にFactor型(因子型)にされてしまう。

これを解決するための方法は列の非因子化を参照。

 

CoffeeScript – コマンドライン引数

process.argv[n]にコマンドラインの入力が格納される。

  • argv[0] コマンド(“coffee”)
  • argv[1] ファイル名(“パス/ファイル名”)
  • argv[2] 1つ目の引数
  • ・・・

指定していない引数を参照するとundefined

 

 

 

CoffeeScript – 継承・オーバーライド・super()

クラスの継承とコンストラクタ

ポイント

親クラスを継承した子クラスのコンストラクタでは、基本的にsuper()で親クラスのコンストラクタを呼び出す。

たとえば次のように親クラスParentを子クラスChildが継承した場合、子クラスに親クラスのプロパティが引き継がれている。

ところが次のように子クラスでコンストラクタを定義した場合は、親クラスのプロパティが引き継がれない。

これは子クラスのコンストラクタが親クラスのコンストラクタをオーバーライドしてしまったためで、この状態では親クラスのコンストラクタが実行されない。

そこで、子クラスのコンストラクタからsupper()で親クラスのコンストラクタを呼び出すと、親クラスのコンストラクタも実行され、プロパティが引き継がれる。

コンストラクタが引数をとる場合も、super()で親クラスのコンストラクタに合わせた引数を指定すればよい。

メソッドのオーバーライドと継承

例えば次のコードでは、親クラスのmethod()を子クラスのmethod()がオーバーライドしている。

子クラスからオーバーライドした親クラスのメソッドを呼び出したい場合は、super()を使う。

 

CoffeeScript – 抽象クラス

概要

Javaの場合だと、抽象クラスを書く場合には”abstract”宣言をして、具体のクラスで実装すべきメソッドの宣言だけを行うが、CoffeeScript/Javascriptの場合はこれと異なる。

準備

まず、同じ名前executionのメソッドを持つ2つのクラスConcrete1Concrete2を考える。メソッド名は同じだが、各クラスで処理内容は異なる。

次にexecution()について共通な2つのクラスを抽象化したAbstractクラスを導入する。

抽象クラスの導入

CoffeeScript/Javascriptではabstractキーワードがなく、abstractなメソッドも中身が空のもので定義。ただし抽象クラスのままでインスタンス化したときの注意喚起のメッセージを実装。

Javaなどでは型指定が厳格なので、異なる2つのクラスをAbstractクラスで抽象化して、同じメソッドを呼び出すことでクラスごとに特有の処理をさせる。

CoffeeScript/Javascriptでは変数の型がないため、抽象化をしなくてもメソッド名を同じにしておくだけで同じ効果を得る。ただしコンパイル時のチェックなどがない点に注意。

共通部分がある場合

以下のように、2つのクラスで共通の処理と個別の処理が混在している場合を考える。

共通の処理を各クラスごとに実装しているが、コピー/ペースト操作で行うとしてもエラーが入り込みやすく、その後の保守性も悪い。

共通部分の集約(1)

エラー回避と保守性の向上のため、共通部分を一つにまとめる。

  • 抽象クラスAbstractを導入
  • Abstractexecution()メソッドのフレームを集約
  • 共通処理部分commonExecution()Abstractのメソッドとして実装
  • 2つのクラスでAbstractを継承
  • これらの子クラスで、それぞれの個別処理部分のみを実装

Concrete1Concrete2Abstractを継承したことによって2つの具象クラスがAbstractクラスのexecute()メソッドも継承され、具象クラスでexecute()メソッドを呼ぶと、Abstractexecute()メソッドが実行される。

その後、共通部分のcommonExecution()Abstractのメソッドが呼ばれ、specificExecution()については、各具象クラスでオーバーライドされたメソッドが呼ばれる。

共通部分の集約(2)

各具象クラスでexecution()のから書いていくこともできるが、この場合は共通処理が一括してsuper()で実行されるため、「共通の前処理と後処理の間に各クラス独自の処理を置きたい」という場合には適さない。

 

 

CoffeeScript – geom2d.MovingAgentクラス

パッケージ

taustation_geom2d

クラス名

taustation_geom2d.MovingAgent

クラス仕様

概要

自分の位置を表すVectorオブジェクトと移動速度を表すVectorオブジェクトを要素に持ち、他のMovingAgentとの位置関係を判定するメソッドを準備している。

なお、Vectorクラスには、Vectorを位置ベクトルとしたときに、その点とMovingAgentとの位置関係を表すメソッドが用意されている。

クラス変数

なし

クラス・メソッド

なし

インスタンス・プロパティ

pos
自らの位置を保持するVectorオブジェクト
v
自らの移動速度を保持するVectorオブジェクト

コンストラクタ

constructor()
位置(0, 0)、速度(0, 0)のMovingAgentインスタンスを生成する。

インスタンス・メソッド

基本メソッド

setPosition(x, y)
MovingAgentの位置をx、yの座標値で指定する。
setVelocity(vx, vy)
MovingAgentの速度をvx、vyの成分で指定する。
getClone()
元のMovingAgentオブジェクトと同じ内容のクローンを生成して返す。

判定

isInFrontOf(other)
このMovingAgentオブジェクトが引数のMovingAgentオブジェクトの前方(左右180度より進行方向の側)にあるときtrue、後方にあるときfalseを返す。真横の時は前方と判定される。
isIntheRearOf(other)
isInFrontOf()と前後逆の判定結果を返す。
isOnTheRightOf(other)
このMovingAgentオブジェクトが引数のMovingAgentオブジェクトの右方にあるときtrue、左方にあるときfalseを返す。進行方向の延長線上にあるときは右方と判定される。
isOnTheLeftOf(movingAgent)
isOnTheRightOf()と左右逆の判定結果を返す。

コード