16. 種々のベクトル


ベクトルの要素には実数以外を用いることも出来る.

複素型ベクトル

複素型ベクトルは複素数を要素とするベクトルのことである.実部と虚部をベクトルで指定したり,絶対値と偏角を指定することでも複素型ベクトルを作ることが出来る.

 
 c(1+1i, 2+3i)                         # 虚数 1+i を表すときは 1+1i と表記する

[1] 1+1i 2+3i                          # 1+i とすると i は変数と認識される

 complex(re=1:3, im=4:6)               # re :実部  ,im :虚部

[1] 1+4i 2+5i 3+6i

 complex(mod=c(1,2), arg=c(0, pi))     # mod:絶対値,arg:偏角

[1]  1+0.000000e+00i -2+2.449213e-16i

ベクトルの要素中に 1 つでも複素数が見つかれば要素全体が複素数となる.

複素数を要素にもつベクトル z を処理する場合は,実数同士の計算時に用いた関数に加えて,以下の関数を用いることが出来る.

記号

Re(z)

Im(z)

Mod(z)

abs(z)

Arg(z)

Conj(z)

意味

実部

虚部

絶対値

絶対値

偏角

共役複素数

論理型ベクトル

論理値を要素とするベクトルを論理型ベクトルと呼ぶ.正式名(TRUE,FALSE)でも略記名(T,F)でも指定できる.論理型ベクトルに対する論理演算子として,& (論理積) , | (論理和) ,! (否定) ,xor (排他的論理和) があり,これらを用いると要素毎の演算を行なう.2 つのベクトルの長さが異なる場合は短い方の要素が循環的に使われる.

 
 c(T, F, T) | c(TRUE, FALSE, FALSE)

[1]  TRUE FALSE  TRUE

 !c(T, F, T)

[1] FALSE  TRUE FALSE

 xor( c(TRUE, FALSE, TRUE), c(TRUE, FALSE, FALSE) )

[1] FALSE FALSE  TRUE

論理ベクトル全体を調べる関数として以下の様なものがある.

 
 x <- seq(0, 1, 0.2)
 any(x > 0.8)         # x の中に 1 つでも 0.8 以上の要素があるか

[1] TRUE

 all(x < 0.8)         # x の要素は全て 0.8 以下であるか

[1] FALSE

文字型ベクトル

文字列を要素とするベクトルを文字型ベクトルと呼ぶ.

 
 c("HOKKAIDO", "SENDAI", "TOKYO", "NAGOYA", "OSAKA", "HAKATA")

[1] "HOKKAIDO" "SENDAI"   "TOKYO"  "NAGOYA"  "OSAKA"  "HAKATA" 

文字列には辞書式順序(ASCII 配列)による大小関係があるので,この規則に従った文字型ベクトル同士の比較演算を行なうことが出来る.

 
 "TOKYO" > "OSAKA"

[1] TRUE 

 "HAKATA" > "OSAKA"

[1] FALSE 

順序つき因子ベクトルと順序無し因子ベクトル

関数 factor() を用いることで,カテゴリーを要素としたベクトルを作成することが出来る.関数 levels() でグループ化されているかを確認することが出来,関数 str() でオブジェクトの要約値を表示することが出来る.

 
 x <- rep(c("L", "M", "H"), 9)
 ( fc <- factor(x) )             # 要素をグループ化

[1] L M H L M H L M H L M H L M H L M H L M H L M H L M H
Levels: H L M

 levels(fc)                      # グループ化されているかを確認("L", "M", "H" の順ではない...)

[1] "H" "L" "M"

結果を見ると,要素の順序が勝手に入れ替わっていることが分かる.明示的に順序を指定する場合は,引数 levels に順序を指定すれば良い.

 
 ( fc <- factor(x, levels=c("L", "M", "H")) )

[1] L M H L M H L M H L M H L M H L M H L M H L M H L M H
Levels: L M H

関数 factor() では因子間に大小関係は無かったが,関数 ordered() で順序付きの因子ベクトルが作成出来る.

 
 fc <- ordered(x)
 str(fc)                         # オブジェクトの要約値を表示(大小関係があることが分かる)

Ord.factor w/ 3 levels "H"<"L"<"M": 2 3 1 2 3 1 2 3 1 2 ...

関数 gl(カテゴリー数, 繰り返し数, ラベル又は要素数) でパターンを持った因子ベクトルを生成することが出来る.

 
 gl(2, 10, 20)

[1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2
Levels: 1 2

 gl(2, 8, label = c("Control", "Treat"))

[1] Control Control Control Control Control Control Control Control
[9] Treat   Treat   Treat   Treat   Treat   Treat   Treat   Treat  
Levels: Control Treat

日付型ベクトル

R には日付や日時データを扱うための関数がいくつか用意されている.まず,関数 as.Date() で文字型データを日付型データに変換できる.

 
 as.Date("2012/08/15")

[1] "2012-08-15"

 as.Date("08/15/2012", format="%m/%d/%Y")

[1] "2012-08-15" 

「%d」「%m」「%Y」以外のフォーマットを使う場合,日本語環境では数値の代わりに日本語の文字列が入ることにより NA になってしまう.この場合,事前に関数 Sys.setlocale("LC_TIME","C") を実行する必要がある.

 
 Sys.setlocale("LC_TIME","C")

[1] "C"

 as.Date("2012/Aug/15", format="%Y/%b/%d")

[1] "2012-08-15" 

関数 strptime() で文字型データを日時型データに変換できる.また,関数 format() で日時データを表す文字列を作成することもできる.

 
 Sys.setlocale("LC_TIME", "C")

[1] "C"

 strptime("15Aug2012", "%d%b%Y")

[1] "2012-08-15"

 format(Sys.time(), "%Y %b %d %H:%M:%S %Z")

[1] "2012 Aug 15 17:31:23 JST" 

「%d」や「%m」などのフォーマットの一覧を表に挙げる.なお,関数 strptime() は全てのフォーマットを使うことができるが,関数 as.Date() はこの一部(下表の赤字部分)しか使えない.

フォーマット

機能

%A,%a

曜日の英語名(小文字は略記)

%B,%b

月の英語名(小文字は略記)

%c

ロケール(言語と地域を組み合わせたもの)固定の日時表示

%d

月の中の日(01-31)

%H

時(24 時制:00-23)

%I

時(12 時制:01-12)

%j

年の中の日(001-366)

%M

分(00-59) 

%m

月(01-12)

%p

ロケール固定のAM/PM 表示

%S

秒(00-61)

%U

年の中の週(00-53:週のはじめを日曜日とする)

%W

年の中の週(00-53:週のはじめを月曜日とする)

%w

週を表す整数(0-6:日曜日を0 とする)

%X,%x

ロケール固定の時間表示(小文字は日付表示)

%Y,%y

4 桁表示の西暦(小文字は2 桁表示の西暦)

%Z,%z

タイムゾーン

日付型データに変換した後は,四則演算や統計的な処理を行うことができる.

 
 x <- as.Date(c("2012/07/01", "2009/08/01", "2009/08/15"))
 x[2] - x[1]   # 日付の差

Time difference of -1065 days

 diff(x)       # 日付の差

Time differences in days
[1] -1065    14

 mean(x)       # 日付の平均

[1] "2010-07-26" 

日付に関するさらなる処理や,時間に関する処理については,以下の頁を参照されたい.