読者です 読者をやめる 読者になる 読者になる

Rで計量社会学:第二回「オブジェクトの概要(ベクトル)」

前回の最後に見たように,オブジェクトには種類があり,種類によって扱い方が異なる。計量社会学においてRを扱う上で最低限必要となるオブジェクトを再掲する。


  • ベクトル

    • 数値ベクトル is.numeric()

    • 文字列ベクトル is.character()

    • 因子ベクトル(順序付き,順序なし) is.factor()

    • 論理ベクトル is.logical()



  • リスト

    • リスト is.list()

    • データフレーム is.data.frame()



ベクトル


Rにおいてのベクトルは,高校数学で習ったベクトルとは少し異なる。難しく考える必要はなく,Rにおいては,ベクトルとは以下のようなものである。

num <- c(1, 2, 3)    # 数値ベクトル作成
num
#=> [1] 1 2 3

char <- c("abc", "def", "ghi")    # 文字列ベクトル作成
char
#=> [1] "abc" "def" "ghi"

tf <- c(TRUE, FALSE , TRUE)    # 論理ベクトル作成
tf
#=> [1]  TRUE FALSE  TRUE

このように,単にデータが複数並んだものと思っていい。ただし,この説明には語弊がある。1や"abc"という単一のデータも,長さ1のベクトルだからである。しかし,イメージとしては理解できたと思う。
1行目では,数値ベクトルを作成している。R上でそのまま数値を記述した場合,それは数値とみなされ,数値ベクトルが作成される。
5行目では,文字列ベクトルを作成している。ダブルクォート(")で文字列(数値を含む)を囲った場合,文字列とみなされ,文字列ベクトルが作成される。ちなみに文字列をダブルクォートで囲まなかった場合,例外を除いて変数とみなされる。
9行目では論理ベクトルを作成している。これは前述の例外に当たる。TRUEやFALSEという文字列はダブルクォートで囲っていないが,変数とはみなされていない。11行目の出力でもダブルクォートなしでそのまま出力されている。ダブルクォートで囲っていないTRUEとFALSEは論理値として扱われ,論理ベクトルが作成される。論理ベクトルは非常に重要なオブジェクトだが,最初のうちはあまり目にすることはない。また回を改めて解説をするが,前回is.vector()などを実行した結果返されたものが,論理ベクトルである。論理ベクトルは,条件の真偽判断の結果として得られる。

上の例では,同時に各種オブジェクトの作成の仕方も示している。ほとんどのベクトルオブジェクトは,c()という関数で作成できる。オブジェクトの作成方法は,利便性のために各種用意されているので,今後少しずつ例示する。とりあえず,頻繁に使われる方法を二つ紹介する。

1:10    # 連続した数値ベクトルの作成
#=> [1]  1  2  3  4  5  6  7  8  9 10
3:7
#=> [1] 3 4 5 6 7
-5:5
#=> [1] -5 -4 -3 -2 -1  0  1  2  3  4  5
5:2
#=> [1] 5 4 3 2

0.5:3
#=> [1] 0.5 1.5 2.5    # 間隔は1で固定されている
1:6 / 2    # スラッシュ(/)は割り算の記号,掛け算はアスタリスク(*)
#=> [1] 0.5 1.0 1.5 2.0 2.5 3.0    # ベクトルを後で割ったり掛けたりすれば,間隔を変えられる

rep(4, times = 5)    # オブジェクトの繰り返し
#=> [1] 4 4 4 4 4
rep(1:3, times = 3)
#=> [1] 1 2 3 1 2 3 1 2 3

rep("a", times = 3)    # 文字列でも可能
#=> [1] "a" "a" "a"
rep(c("ab", "cd"), times = 2)
#=> [1] "ab" "cd" "ab" "cd"

c(1:3, 7:9)    # c()はベクトルを結合するのが本来の機能
#=> [1] 1 2 3 7 8 9
c("ab", "cd", "ef")
#=> [1] "ab" "cd" "ef"
x <- 1:3
y <- -3:-1
z <- 10:14 * 2 / 5
c(x, y, z)    # オブジェクトをそのまま与えるのと変数を与えるのは同じ意味
#=> [1]  1.0  2.0  3.0 -3.0 -2.0 -1.0  4.0  4.4  4.8  5.2  5.6

数値の間にコロン(:)を挟むと,連続した数値ベクトルを作成する。負の値でも可能だが,間隔は常に1であり,変えることはできない。ベクトルの間隔を変えたい場合は,ベクトルに対して演算を加える必要がある。
rep()は与えられたオブジェクトを,指定した回数繰り返して返す関数である。timesで繰り返す回数を指定する。与えるオブジェクトはなんでもいい。
c()の本来の機能は,ベクトルの結合である。1〜11行目では,長さ1のベクトルを結合していたというわけである。

repはreplication(反復)の略である。また,cはcombination(結合)の頭文字である。このように,関数名には語源があるので,ヘルプを見て確かめておくと覚えやすい。help()という関数を使い,help(rep)のようにするか,頭に?をつけ?repのようにして実行すると,関数のヘルプを見ることができる。

ちなみに,関数に与えるオブジェクトを引数(ひきすう)と呼び,関数が返すオブジェクトを返り値もしくは戻り値と呼ぶ。Rにおいて,返り値は常にオブジェクトである。よって,変数に代入することができ,新たに処理を加えることが可能である。

因子ベクトル


因子ベクトルはc()で作ることができない。因子ベクトルを作る最も簡便な方法は,文字列ベクトルを変換する方法である。

char <- c(rep("a", 2), rep("b", 3), rep("c", 4))    # 関数は入れ子にすることができる!
char
#=> [1] "a" "a" "b" "b" "b" "c" "c" "c" "c"
is.character(char)
#=> [1] TRUE
fac <- as.factor(char)    # 文字列ベクトルを因子ベクトルに変換
fac
#=> [1] a a b b b c c c c    # 文字列ベクトルに似ているが…
#=> Levels: a b c
is.character(fac)
#=> [1] FALSE    # 文字列ベクトルではない
is.factor(fac)
#=> [1] TRUE    # 因子ベクトルになっている
table(fac)    # 度数分布表やクロス表を作成するための関数
#=> fac
#=> a b c 
#=> 2 3 4 

as.factor()は,与えられたオブジェクトを因子ベクトルに変換する関数である。似た機能を持つ変数として,as.numeric()やas.character()などもある。
因子ベクトルとは,つまりカテゴリ変数である。そのため,もっぱらカテゴリカルな分析をする際に用いられる。引数として因子ベクトルしか受け付けない関数に数値ベクトルを渡したり,その逆を行って,エラーを起こしてしまうことがよくある。エラーを起こしてしまったときは,is.factor()で確認したり,関数のヘルプで,引数として要求されるオブジェクトの種類を確かめる必要があるだろう。

ここでは,順序なしの因子ベクトルのみ説明している。順序つき因子ベクトルも基本は変わらない。順位相関係数を出したいときや順序ロジットを行うときは順序つき因子ベクトルを用いる必要がある。ただし,用途が限られるため,ここでは解説しない。

ベクトル操作は,Rの基本にして最も重要な部分である。Rをどれだけ使いこなせるかは,ベクトルをどれだけ使いこなせるかとほとんど同じ意味とさえ言えるかもしれない。今回挙げたサンプルスクリプトを自分でいじるなどして,しっかり慣れてほしい。