R

トップページ

Google
WWWを検索
サイト内を検索

1 ベクターに名前をつける

まずは属性のおさらいです。RはvectorやMatrixの各要素に名前をつけられるのが特徴ですが、属性によって実現されています。

d <- 1:3
attributes(d)
NULL

vecotrをつくっただけでは属性がついていませんが、

names(d) <- c("a", "b", "c")
attributes(d)
$names
[1] "a" "b" "c"

名前をつけると属性に書かれることが分かります。

2 ベクター → 行列

ベクターに属性dimを付与すると行列になります。

d <- 1:9
attributes(d) <- list(dim=c(3, 3))
d; class(d)
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
[1] "matrix" "array" 

簡単ですね。同様にarrayにすることもできます。 属性はリスト構造になっていて、複数の属性を同時に持てます。 逆にdimを消すとベクターに戻ります。実用上はc(d)とでもした方が速いのですが、理解のためにやってみましょう。

attributes(d) <- NULL
d; class(d)
[1] 1 2 3 4 5 6 7 8 9
[1] "integer"

Rの世界では構造のあるvectorがmatrixと言えます。

3 リスト → データフレーム

リストの属性を変化させて、データフレームにしてみましょう。 まずはリストを作って、クラスを確認します。

d <- list(a=1:3, b=6:8)
d; class(d)
$a
[1] 1 2 3

$b
[1] 6 7 8
[1] "list"

次に、作ったリストに属性を付与します。 classrow.namesを設定すると、

attributes(d) <- list(names=names(d), class="data.frame", row.names=1:max(sapply(d, length)))
d; class(d)
  a b
1 1 6
2 2 7
3 3 8
[1] "data.frame"

データフレームに変化したことがわかります。

4 ベクター → ファクター

因子型もベクターに属性を付与した構造になっていますが、名前と値の関係がひっくり返ります。 まずは、文字列のベクターを準備します。

v <- c("a", "b", "c")[round(runif(9, min=0.5, max=3.5))]
v
[1] "c" "c" "c" "a" "b" "c" "c" "c" "a"

aを1,bを2,cを3と文字列ごとに数字を割り当てたベクトルをつくります。

n <- unique(sort(v))
w <- 1:length(n)
names(w) <- n
v <- w[v]
v
c c c a b c c c a 
3 3 3 1 2 3 3 3 1 

names属性がついていますが、必要ではないです。 最後に、levelsc("a", "b", "c")に、classをfactorに設定すると因子型になります。

attributes(v) <- list(levels=n, "class"="factor")
v; class(v)
[1] c c c a b c c c a
Levels: a b c
[1] "factor"

4.1 順序付き因子

class属性にorderedもつけておくと、順序付き因子になります。

attributes(v) <- list(levels=c("c", "a", "b"), "class"=c("ordered", "factor"))
v; class(v)
[1] b b b c a b b b c
Levels: c < a < b
[1] "ordered" "factor" 

factorとorderedの順番を誤ってc("factor", "ordered")とすると、順序付なし因子として扱われるので注意してください1levelsの順序を入れ替えたのにお気づきでしょうが、順序付きだとlevelsの順序に応じた比較が可能になります。

sort(v)
[1] c c a b b b b b b
Levels: c < a < b
v[1] < v[3]
[1] FALSE

順序ロジットの被説明変数のためみたいなデータ型ですね。

5 まとめ

Rの基本的なデータ構造はvectorとlistしかなく2、matrixとarrayとfactorとdata.frameは属性をつかった拡張に過ぎません。様々なデータのために様々なクラスが用意されていますが、それらもlistです。こう考えると、実に簡素なプログラミング言語であることが分かります。 なお、data.frame, matrix, array, factor, orderedの方が簡潔に読みやすく書けます。以上のような煩雑な処理は不必要に書くのは避けましょう。


  1. Rのオブジェクト指向はこの順番でクラスの親子関係を把握しています。↩︎

  2. 構造データの変数として使うものではなく使い勝手はlistと同様なので、environmentは除外しました。↩︎