一人R勉強会 第3回

Rの基礎とプログラミング技法

Rの基礎とプログラミング技法

第2章の続きから

データ構造とかの話になってきた

2.8データ型

オブジェクトのデータ型については、is.で始まる関数を使えば型が確認できる

なかなか便利ですね。

2.9データ構造とその扱い

Rには厳格な意味でのスカラーはない。それは長さ1のベクトルとして表現される。

ようやくこの辺りの感覚が分かり始めてきたかも。

2.9.1ベクトル(Vecotor)

ベクトルの要素は任意のデータ型で構わないが、しかしベクトル内部の要素は全て同じデータ型でなければならない

初め意味が分からなかったが、サンプルコードで理解した。
あるベクトルは要素として任意のデータ型を持つことが可能だが、その要素は全て同じデータ型である必要がある。
というか、同じ要素でない時は強制的に変換されるようだ。

  • ベクトルを作るにはc()
  • ベクトルの長さを調べるにはlenght()
  • 転置をとるにはt()
  • ベクトルの要素には名前を付けることができる
    • c(hogehoe="fugafuga")的な
  • 連続する数を作成するにはseq()
    • 単純なものなら":"を使えばよい
  • 同一オブジェクトの繰り返しにはrep()

ベクトルでは要素ごとに計算が行われる

これ重要ですね。
基本は要素同士の計算。

  • %*%は行列積を計算するため。

内積の計算例を見て気づいたんだが、ベクトルは列ベクトルで表現されているようだ。
単純な出力に惑わされてはいけない。

> a <- c(1,2,3)
> a
[1] 1 2 3
> t(a)
     [,1] [,2] [,3]
[1,]    1    2    3
> t(t(a))
     [,1]
[1,]    1
[2,]    2
[3,]    3

ベクトルの添字については重要そうなもの

  • 複数の添字はベクトルで表現可能
  • 数字の前にマイナス記号を付けると、その添字番号の要素を除去
  • TRUEは要素の「選択」、FALSEは「除外」を意味する
  • 空の角括弧"[]"はベクトルの全ての要素を置き換える

2.9.2行列(matrix)

行列はmatrix()で作成する。
何かいろいろオプションあるけど、使うときに確認すればいいや。

自分でRのコードを書いていて実際にはまったことが書かれていた。

例えば行列から取り出された要素のデータ構造は、もはや行列ではなく、ベクトルかもしれない。

まさに。
そして対処法

これを防ぐには"[]"による添字指定に「常に」引数drop=FALSEを加えて指定sるとよい。

らしい。

> a <- matrix(1:6,3)
> a
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
> a[1,1]
[1] 1
> str(a[1,1])
 int 1
> a[1,1,drop=FALSE]
     [,1]
[1,]    1
> str(a[1,1,drop=FALSE])
 int [1, 1] 1
 

おお、確かに違う。

多分頭に入れておいた方がいいこと

行列は、次元に関する属性付きのベクトルで表現されている

数学での考え方とは違い、Rでは行列がベクトルの特殊な場合であって、その逆ではないのである。

2.9.3配列(array)

配列は任意の数の次元を持ち、array()によって生成される。

らいいですが、例を見てもよく分からん。
3次元配列の例なんだけど、何だこれ。

ああ、3次元構造を表しているのか。
確かに

3次元以上の配列を作成してもあまり実用性がない。構造の見通しがたちまち効かなくなるからである。

2.9.4リスト(list)

リストは再起的に定義され、異なったデータ構造オブジェクトを要素として含み得る。

えーと、リストは、ベクトルと違って各要素毎のデータ型が一環している必要がないということかな。

  • list()でリスト作成
  • 要素へのアクセスは"[[]]"
  • 要素を名前で指定している時は"$"演算子でアクセスできる。

実はリストも内部ではベクトルで表現されているので、ベクトルと同様に演算子"[]"でリストの複数の要素に同時にアクセスすることができる。

でた、またベクトル!
とはいえ、

演算子"[]"が返すのはリストであって、ベクトルではない。

このあたりは、実際に使ってつまづかないと実感が持てないなぁ

2.9.5データフレーム(data frame)

  • 関数data.frame()でデータフレームを生成
    • 要素は全て同じ長さにする

データフレームは、Rの標準的なデータ構造である!多くの関数類が引数つぃてデータフレームを想定している。

確かにエラーでdata.frame()が云々と出ていた気がしなくもない。
例を見ると、csvファイルを読み込んだときと同じ感じですね。

変数間の関連を指定しやすい方法として関数subset()がある

こいつはすげー

values_1D[which(values_1D$VOLUME > 0),]

こう書いていたのが、

subset(values_1D, VOLUME > 0)

こう書ける、と。
スマートですね。

あと何か色々関数があるみたいだけど、実際に使って行かないとわからないなぁ。
正規S4オブジェクトの説明もあった。
そういえばここに書かれている"@"演算子をgarchFit関数で使った記憶がある。