まずはRを電卓として使ってみましょう。
> 123 + 456 [1] 579
最後に出てくる [1]
は,出力結果が長さ 1 のベクトル (vector) であることを示しています。
デフォルトの桁数を例えば 16 桁にしたければ options(digits=16)
と打ち込みます。元に戻すには options(digits = 7)
とします。これは表示桁数だけで,途中の計算は16桁程度以上で行われています。統計計算には十分な精度です。
変数(オブジェクト)は大文字・小文字を区別します。
複数の値を持つデータベクトルを作成するには,連結(concatenate または combine)を意味する c()
を使い,ベクトルの各要素をコンマで区切ります。例えば,世界人口の推定値を要素としてもつベクトルを作成してみましょう。
> world.pop = c(2525779, 3026003, 3691173, 4449049, 5320817, 6127700, 6916183)
また,c()
関数を使うことで,複数のベクトルをまとめることができます。
> pop.first = c(2525779, 3026003, 3691173) > pop.second = c(4449049, 5320817, 6127700) > pop.all = c(pop.first, pop.second, 6916183) > pop.all [1] 2525779 3026003 3691173 4449049 5320817 6127700 6916183
ベクトルの中にある要素を取り出したい場合には,角括弧([ ]
)を用います。一方で,番号にマイナス記号(-
)を付けると,特定の要素を取り出すことができます。ただし,こうした操作を行っても元のベクトルが変わるわけではありません。
> world.pop[2] [1] 3026003 > world.pop[c(2, 4)] [1] 3026003 4449049 > world.pop[c(4, 2)] [1] 4449049 3026003 > world.pop[-3] [1] 2525779 3026003 4449049 5320817 6127700 6916183
このベクトル内の要素は数値なので,算術演算を行うことができます。演算はベクトル内の各要素に対して行われます。ベクトルの中の各要素を 1000 で割って,1000人単位から100万人単位の推定値に換算してみましょう。
pop.million = world.pop / 1000 > pop.million [1] 2525.779 3026.003 3691.173 4449.049 5320.817 6127.700 6916.183
各年代の人口の増加率を求めてみよう。
> pop.increase = world.pop[-1] - world.pop[-7] > percent.increase = (pop.increase / world.pop[-7]) * 100 > percent.increase [1] 19.80474 21.98180 20.53212 19.59448 15.16464 12.86752
わかりやすくするため,各オブジェクト(各変数)の中身を示しておく。
> world.pop[-1] [1] 3026003 3691173 4449049 5320817 6127700 6916183 > world.pop[-7] [1] 2525779 3026003 3691173 4449049 5320817 6127700 > pop.increase [1] 500224 665170 757876 871768 806883 788483
小数点以下を丸めるには round()
関数を使います。
> percent.increase [1] 19.80474 21.98180 20.53212 19.59448 15.16464 12.86752 > round(percent.increase) [1] 20 22 21 20 15 13
ここではデータを要約(基本的な記述統計を計算)する場合に役立つ基本的な関数を紹介します。
> length(world.pop) [1] 7 > min(world.pop) [1] 2525779 > max(world.pop) [1] 6916183 > range(world.pop) [1] 2525779 6916183 > mean(world.pop) [1] 4579529 > sum(world.pop) [1] 32056704 > sum(world.pop) / length(world.pop) [1] 4579529
seq()
関数を使うと,同じ数だけ増えていく(または減っていく)等差数列のベクトルを作成できます。1950年から2010年まで10年おきのオブジェクトを作成するのであれば
> year=seq(from=1950,to=2010,by=10) > year [1] 1950 1960 1970 1980 1990 2000 2010
最初の引数 from は,数列の始値を示します。2番めの引数 to は終値を示します。最後の引数 by は,数列の隣り合う公差(隣り合う2項の差)を表します。
seq(1950, 2010, 10)
のように始値(はじめね),終値(おわりね),増分で指定することもできます。
コロン演算子(:)は,単純な数列,すなわち,コロンの前の数から後ろの数まで1ずつ増加または減少する数列を作成する。
> names(world.pop) = year > names(world.pop) [1] "1950" "1960" "1970" "1980" "1990" "2000" "2010" > world.pop 1950 1960 1970 1980 1990 2000 2010 2525779 3026003 3691173 4449049 5320817 6127700 6916183
function()
関数で新しい関数を作ることができます。
my.summary = function(x) { #この関数は引数を1つとる s.out = sum(x) l.out = length(x) m.out = s.out / l.out out = c(s.out,l.out, m.out) names(out) = c("sum", "length", "mean") return(out) # 出力を呼び出して関数を閉じる }
> my.summary(z) sum length mean 55.0 10.0 5.5 > my.summary(world.pop) sum length mean 32056704 7 4579529
## “world.pop”変数から奇数番目の要素を取り出す > UNpop$world.pop[seq(from=1,to=nrow(UNpop),by=2)] [1] 2525779 3691173 5320817 6916183
Rでは,欠損値はNAと表示される。ここでは,mean()関数など多くの関数を実行する際に欠損値を除外してくれる引数na.rm = TRUE を紹介しておく。以下の例では,ベクトルの8番目が欠損しており,欠損値が除外されるまで平均が計算できない。
> world.pop=c(UNpop$world.pop, NA) > world.pop [1] 2525779 3026003 3691173 4449049 5320817 6127700 6916183 NA > mean(world.pop) [1] NA > mean(world.pop, na.rm = TRUE) [1] 4579529
オブジェクトを保存する
Rを保存する際,作業スペースを保存するかどうか訊かれる。このとき,必要なもののみ保存することを習慣づけるために,noを選択するようにしよう。
参考
Rの初歩というページ(https://oku.edu.mie-u.ac.jp/~okumura/stat/first.html)の中の「終了のしかた」参照。
データフレームオブジェクトを,RDataファイルではなくCSVファイルとして保存したい場合もある。以下の例のように,オブジェクト名とファイル名を指定してwrite.csv()関数を使う。
練習問題
自己申告に基づく投票率のバイアス
問題1
> summary(turnout) year VEP VAP total Min. :1980 Min. :159635 Min. :164445 Min. : 64991 1st Qu.:1986 1st Qu.:171192 1st Qu.:178930 1st Qu.: 73179 Median :1993 Median :181140 Median :193018 Median : 89055 Mean :1993 Mean :182640 Mean :194226 Mean : 89778 3rd Qu.:2000 3rd Qu.:193353 3rd Qu.:209296 3rd Qu.:102370 Max. :2008 Max. :213314 Max. :230872 Max. :131304 ANES felons noncit overseas Min. :47.00 Min. : 802 Min. : 5756 Min. :1803 1st Qu.:57.00 1st Qu.:1424 1st Qu.: 8592 1st Qu.:2236 Median :70.50 Median :2312 Median :11972 Median :2458 Mean :65.79 Mean :2177 Mean :12229 Mean :2746 3rd Qu.:73.75 3rd Qu.:3042 3rd Qu.:15910 3rd Qu.:2937 Max. :78.00 Max. :3168 Max. :19392 Max. :4972 osvoters Min. :263 1st Qu.:263 Median :263 Mean :263 3rd Qu.:263 Max. :263 NA's :13 > dim(turnout) [1] 14 9 > range(turnout$year) [1] 1980 2008
14の観察と9つの変数が含まれており,1980年から2008年までのデータが含まれている。
> 投票率1 = (total / (VAP + overseas)) * 100 > 投票率1 [1] 52.03972 40.24522 52.53748 36.07845 49.72260 35.93884 54.04097 [8] 38.03086 47.53376 34.83169 49.34211 35.82850 54.54777 55.67409
次に有権者人口(VEP)を使って投票率(以下「投票率2」)を計算してみる。
> 投票率2 = (total / VEP) * 100 > 投票率2 [1] 54.19551 42.13701 55.24860 38.14115 52.76848 38.41895 58.11384 [8] 41.12625 51.65793 38.09316 54.22449 39.51064 60.10084 61.55433 > 投票率2 - 投票率1 [1] 2.155785 1.891789 2.711115 2.062703 3.045878 2.480105 4.072866 [8] 3.095397 4.124166 3.261470 4.882388 3.682145 5.553078 5.880239 > range(投票率2 - 投票率1) [1] 1.891789 5.880239 > mean(投票率2 - 投票率1) [1] 3.492794 > round(mean(投票率2 - 投票率1)) [1] 3
約3ポイントほど有権者人口を使った投票率の方が高い。