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

 

 

 

Boids 3.1 – コード説明

概要

Boids 3.1で、いよいよEnemyを導入する。大まかな流れは以下の通り。

  • Creatureクラスを継承したEnemyCreatureクラスを定義する
  • EnemyCreature特有の行動はEnemy同士の分離(separation)のみ
  • BoidCreatureはEnemyCreatureを避ける行動をとる
  • BoidCreatureの群とEnemyCreatureの群を、それぞれのClusterオブジェクトに登録。

EnemyCreatureクラスの追加

Creatureクラスを継承したEnemyCreatureクラスを追加する。そのメソッド構成は以下の通り。specificBehaviorについては、Enemyに特別な行動ルールはなく、分離(separation)のみ実装している。separation()メソッドはBoidCreatureとまったく同じロジック。

Controlerクラスの変更

パラメータ関係

Controlerクラスのパラメータ設定用setterを追加(後述)

Enemy発生用メソッドの追加

BoidCreatureクラスと同じ内容で、createEnemyCreature()メソッドを追加

generate()メソッドを変更

generate()メソッドで、Boidに加えてEnemyも指定個体数だけ発生させるよう追加。

BoidがEnemyから逃げる動作

BoidCreatureクラスに新たにavoidEnemy()メソッドを追加し、specificBehavior()でこれを呼び出すよう変更。avoidEnemy()メソッドの内容は以下の通り。

  • 基本のロジックはsepration()メソッドと同じ
  • ただし分離の相手方がEnemyの群になる
  • 敵から回避する角度は、仲間との分離の角度より大きくする(パラメータで与える)

実行部分

ページ読み込み時の実行部分は以下の通りで、2つのボタンのクリックに対する処理を定義。

  • GENERATEボタンが押された時は、BoidCreatureの群とEnemyCreatureの群を発生させる
  • START/STOPボタンが押されたときは、ControlerクラスのstartAndStop()メソッドを呼び出す

コード全体

HTML

CoffeeScript

クラス構成

Fieldクラス

Creatureクラス

BoidCreatureクラス

EnemyCreatureクラス

Clusterクラス

Controlerクラス

 


↑ Boids 3.0のコード説明へ

 

Boids 3.0 – コード説明

概要

Boids 3.xシリーズで敵(Enemy)を導入する準備として、クラス構成の改良などを行った。

Boids 2.xまではBoidだけだった生物の種類に、新たにEnemyという別の種類が加わるが、どちらについても以下の特徴は共通している。

  • 複数個体をClusterオブジェクトにまとめて扱われる
  • Field内を移動する
  • 壁との衝突を避ける

そこで、これらの特徴に関する部分をCreatureクラスから抜き出したものを新たにCreatureとしてテンプレート化し、Boid特有の動作についてはCreatureクラスを継承したBoidCreatureで実装した。

このほか、BoidとEnemy2つの群を扱うことから、Clusterで処理していた画面の消去処理を外に出すなどの変更を行っている。

Creatureクラスのテンプレート化

Boids 2.3

まず、元となったBoids 2.3のコードの構成を確認する。壁の回避、分離、結合、整列に関するメソッドを定義し、これらをmove()メソッドで呼び出している。

Boids 3.0

Boids 3.0では2.3のCreatureクラスをCreatureBoidCreatureに分け、CreatureクラスにはBoidとEnemyに共通する動作を書き、Boidに特有の動作についてはBoidCreatureのメソッドで実装した。

Creatureクラス

Creatureクラスは以下のメソッドを持っている。

wallAvoidance()
壁との衝突を回避するメソッド。
specificBehavior()
このクラスを継承するクラスごとに特有の動作を記述するためのメソッド。抽象クラスのabstractメソッドに相当し、継承したクラスにおいてその内容が実装される。
determinePosition()
上記2つのメソッドで計算された位置と速度から、次の時間ステップにおける位置を決定するメソッド。

BoidCreatureクラス

BoidCreatureクラスはCreatureクラスを継承し、specificBehavior()メソッドを実装する。

BoidCreatureクラスで分離、結合、整列に関するメソッドを定義し、specificBehavior()メソッドでそれらを呼び出している。

描画処理の変更

Boid 3.xでは、BoidとEnemyという2つの生物をそれぞれ別のClusterオブジェクトに登録して扱う。Boids 2.3までは、アニメーションフレーム再描画のための画面消去処理をClusterクラスのdraw()メソッドで行っていたが、このままだとBoid、Enemyそれぞれの描画の際に画像が消去されて、どちらか一方が画面に表示されなくなる。

そこで、画面消去処理をClusterではなくControlergenerate()メソッドとstartAndStop()メソッドに置いた。

 


↑ Boids 2.3のコード説明へ

↓ Boids 3.1のコード説明へ

 

CoffeeScript – Boids 3.x – 天敵

Boids 3.xの概要

Boids 3.xでは、群として行動している集団に「敵(Enemy)」を投入する。BoidがEnemyを避けるように行動ルールを加え、群としてどのような行動パターンとなるかを確認する。

Boids 3.0 – 基本コード

敵を導入する準備として、Creatureクラスの抽象化・テンプレート化などの大幅な改定を行った。挙動はBoids 2.3と変わらない。

Boids 3.0のコード説明




Boids 3.1 – 敵の導入

このバージョンで「敵(Enemy)」を導入する。

  • Boidの群の個体数に比べて、Enemyの個体数は高々数個程度
  • Enemyは互いの衝突を分離行動によって避けるが、Boidに対しては意識しない
  • BoidはEnemyが視野に入ると回避行動をとる
    • 回避行動は分離行動より大きい角度で方向を転換させるのみ

デモンストレーションのBoidsの様子は、あたかも小魚が天敵の魚を避けるような行動パターンをとっている。BoidがEnemyを回避するのはEnemyが前方にいるときだけだが、群としての回避パターンはよく再現できている。

Boids 3.1のコード説明