25. データ型とデータ構造


データ型の変換とデータ構造の変換

データの型を調べたり変換したりする場合は以下の関数が用意されている.その他,関数 paste() のように必要に応じて引数に与えられたオブジェクトの型変換を自動的に行う関数もある.

 

モード

実数

整数

複素数

文字列

論理値

型検査

mode()

is.numeric()

is.integer()

is.complex()

is.character()

is.logical()

型変換

storage.mode()

as.numeric()

as.integer()

as.complex()

as.character()

as.logical()

以下に例を示す.

 
 x <- c(1, 0, 1, 0, 1)
 mode(x)

[1] "numeric"

 mode(x) <- "complex"    # storage.mode(x) <- "complex" でも可
 x

[1] 1+0i 0+0i 1+0i 0+0i 1+0i

 mode(x) <- "logical"
 x

[1]  TRUE FALSE  TRUE FALSE  TRUE

ベクトルの型の間には以下の大小関係がある.

ベクトルの要素は全て同じ型なので,異なった型のデータを集めてベクトルを作ろうとすると上記の変換規則によって『最も大きい』型に揃えられる.また,実数と論理数の間は自動的に変換がなされる.例えば,演算式中に実数値が期待されている時に論理値が表れると以下のように計算される.

同様に,演算式中に論理値が期待されている時に数が表れると以下のようになる.

複素数,文字列へも自動的に変換されるが,逆は意識的に行った方が良い.

論理値の場合の 「 0 でない数 → TRUE 」 に注意.例えば if (2.718) などは TRUE になり,if 文の命令が実行される.

また,データ構造を調べたり変換したりする場合は以下の関数が用意されている.例えば,オブジェクトが配列であるかどうかは is.array() でテスト出来,行列は 2 次元の配列なので is.array() でテストすると結果は TRUE になる.

構造

ベクトル

行列

配列

リスト

データフレーム

順序なし因子

順序つき因子

構造検査

is.vector()

is.matrix()

is.array()

is.list()

is.data.frame()

is.factor()

is.ordered()

構造変換

as.vector()

as.matrix()

as.array()

as.list()

as.data.frame()

as.factor()

as.ordered()

ここで例を示す.

 
 x <- c(1, 0, 1, 0, 1, 0)                     # x にベクトルを代入
 is.list(x)                                   # ベクトルはリストではない

[1] FALSE

 x <- as.list(x)                              # x をリストに変換
 is.list(x)                                   # x はリストであり ...

[1] TRUE

 is.vector(x)                                 # リストはベクトルでもある

[1] TRUE

例示はしないが,as.character() や as.numeric() などで NULL を構造変換すると,指定された型の長さ 0 のベクトルになる.