コメントアウトは、行頭に # をつけます。
変数 a に 1 を代入してみます。
イコールも矢印もどちらも使えます。
Rでは矢印が一般的ですが、この授業ではイコール記法を採用します。
コードを実行するには、実行する行を選択して「⌘RETURN」を押します。
コンソールには、以下のように実行結果が表示されます。 [n]
は、先頭の要素がn番目であることを指します。(以下、必要に応じて省略します。)
## [1] 1
ピリオドを変数の表記に使うこともできます(ただし先頭は不可)。 セミコロンを使うと、一行に複数の文を並べることができます。
## [1] 0.4
## [1] 0.8
大文字と小文字は区別されます。
## [1] 0
## [1] -1
参考:https://qiita.com/maruman029/items/365a2abcdaaf99b720be
a = 1 #整数はデフォルトではdouble型として扱われます
b = 0.2 #double型
c = TRUE; C = T #logical型(T、F表記も可能)
d = 1L #整数型(integer型)として扱いたい時はLをつける
e = "Hello" #character型データ型は typeof で調べます。
## [1] "double"
## [1] "double"
## [1] "logical"
## [1] "integer"
## [1] "character"
型変換には as.xxx を使います。
## [1] "double"
## [1] 1
## [1] "integer"
## [1] "1"
## [1] "character"
numeric
は、integerとdoubleを合わせたカテゴリです。(mode
関数で確認できます)
## [1] "numeric"
## [1] "numeric"
c(n1,n2,n3)
で、ベクトルを生成します。(cはcombineに由来)
## [1] 1 2 3
以降は、2行分の書き方を簡略表記します。
## [1] 1 2 3
## [1] TRUE TRUE FALSE
## [1] "T" "T" "F"
c(a:b) で、一次元のベクトル(a, a+1, …,
b)を作成します。
## [1] 101 102 103 104 105
b<a のときは、(a, a-1, …, b)となります。
## [1] 9 8 7 6 5 4 3 2 1
要素が多い場合は、全ての要素が表示されます(以下は先頭の50要素のみ表示)。
## [1] -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
## [26] 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
ベクトルの長さは length 関数で取得できます。
## [1] 9999337
c(a,b) の引数が非整数の場合は、
初項a、公差1で、b以下のものを集めたベクトルを返します。
## [1] 2.3 3.3
「:」記法の場合、c は省略できます。
## [1] 101 102 103 104 105
## [1] 9 8 7 6 5 4 3 2 1
## [1] 2.3 3.3
seq 関数を使うと、等差数列を作れます。
## [1] 1.00 3.25 5.50 7.75 10.00
## [1] 1 3 5 7 9
rep 関数を使うと、繰り返しのベクトルを作れます。
## [1] 1 2 3 1 2 3 1 2 3
## [1] 1 2 3 1 2
無作為サンプリング関数(sample)を使ってみましょう。
サイコロを1回振ります。実行のたびに結果はランダムに変わります。
## [1] 3
## [1] 4
1~6から無作為サンプルを6回とります(重複なし)。
## [1] 4 2 1 3 5 6
母数よりサンプル数が多いと、エラーになります。
## Error in sample.int(length(x), size, replace, prob): 'replace = FALSE' なので、母集団以上の大きさの標本は取ることができません
replace を TRUE
にセットすると、重複ありモードになります。
## [1] 3 4 1 6 4 5 2
空のベクトルを作成します。
## integer(0)
## logical(0)
第2引数でベクトルの長さを指定します(初期値は0)。
## [1] 0 0 0 0 0 0 0 0 0 0
logical型の場合、初期値は FALSE です。
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Rでは、全てのメンバが同じ型を持つタイプのベクトルを、アトミックベクトルと呼びます。 後で示すように、アトミックベクトルは一次元ベクトルとは限りません。
アトミックベクトルかどうかは is.atomic
で確認できます。
## [1] TRUE
リストはアトミックベクトルではありません(次週学びます)。 (参考)リストは複数の型を扱います。
## [1] FALSE
データフレームもアトミックベクトルではありません(次週学びます)。
## [1] FALSE
(参考)is.vector は、名前以外の属性を持つかを調べます。
リストも大きな枠では「ベクトル」に含まれます。
## [1] TRUE
## [1] TRUE
## [1] FALSE
アトミックベクトルの型は typeof で調べます。
## [1] "logical"
## [1] "integer"
異なる型を入れた場合、適当な型に型変換されます。 以下では、T と 102 は文字列型(character)に型変換されます。
## [1] "character"
## [1] "TRUE"
## [1] "102"
## [1] "hello"
数値も、要素1のベクトルです。
## [1] TRUE
## [1] 2
a1 に2つの要素を追加してみます。
## [1] 101 102 103 104 105 201 202
append 関数を使って結合することもできます。
## [1] 101 102 103 104 301 302
## [1] 101 102 301 302 103 104
## [1] 101 102 103 104 301 302
ベクトルの要素に、ベクトルを指定してみます。
## [1] 201 101 102 103 104 105 202
この場合、a2の要素数は7となり、 例えばa1の3番目の要素(103)は、a2の4番目の要素となります。
## [1] 103
多次元配列の様な構造を持つことはできません。 よって以下の様な書き方をしても、103とはなりません。
## [1] NA
要するに、一次元ベクトルの要素に別の一次元ベクトルを配置すると、 新しいサイズの一次元ベクトルが作られます。
## [1] 101 102 103 104 105
## [1] 201 101 102 103 104 105 202
## [1] 301 201 101 102 103 104 105 202 302
n番目の要素を取り出します。
## [1] 103
n番目の要素を書き換えます。
## [1] 101 102 3 104 105
複数の要素をまとめて取り出す/取り除くこともできます。
## [1] 102 104
## [1] 101 103 105
## [1] 104 105 NA NA NA
特定の条件を満たす要素のみを取り出す時は、 which()
関数で、引数に条件を記述します。
## [1] 15
添字が存在しない場合、空の整数ベクトルが返されます。
## integer(0)
which
と組み合わせると、条件を満たす要素そのものを取り出せます。
## [1] 115
## integer(0)
整数商は「%/%」、割った余りは「%%」です。
例えば、17わる3は、5余り2です。
## [1] 5
## [1] 2
これを使うと、次のようなことができます。
## [1] 102 104 106 108 110 112 114 116 118 120 122 124
## [1] 101 102
ベクトルに対する演算は、全ての要素に対して一度に適用されます。
## [1] 0 1 2 3 4 5
## [1] 0.5 1.0 1.5 2.0 2.5 3.0
## [1] 1 4 9 16 25 36
## [1] 1 2 0 1 2 0
ベクトルのサイズが異なる場合の演算は、 短い方のベクトルの要素が繰り返し使われます。
## [1] 2.1 2.2 3.1 3.2 4.1 4.2
## [1] 0.2 0.4 0.3 0.6 0.4 0.8
ベクトルを比較すると、結果は論理値(TRUE/FALSE)のベクトルになります。
## [1] FALSE FALSE FALSE TRUE TRUE TRUE
## [1] FALSE FALSE TRUE FALSE FALSE FALSE
## [1] TRUE TRUE FALSE TRUE TRUE TRUE
比較演算子は > >= <
<= == != です。 代入の
= と、比較の ==
を混同しないようにしましょう。
複数の条件を組み合わせるには、論理演算子を使います。
&:かつ(AND)|:または(OR)!:ではない(NOT)## [1] FALSE TRUE FALSE FALSE FALSE FALSE
## [1] TRUE FALSE FALSE FALSE FALSE TRUE
## [1] TRUE TRUE TRUE FALSE FALSE FALSE
それぞれの条件は、カッコで囲んでおくと安全です。
論理ベクトルを添字に使うと、条件を満たす要素だけを取り出せます。
これは、(3.4)で学んだ which()
を使った方法と同じ結果になります。
## [1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
## [1] 6 7 8 9 10
## [1] 106 107 108 109 110
## [1] 106 107 108 109 110
## [1] 102 104 106 108 110
## [1] 104 106 108 110
TRUE は 1、FALSE は 0 として計算されるため、 sum や
mean で「条件を満たす要素の個数・割合」を数えられます。
## [1] 5
## [1] 0.5
## [1] 21
## [1] 3.5
## [1] 4
## [1] 1
## [1] 6
any(x):1つでも TRUE があるかall(x):すべて TRUE か## [1] TRUE
## [1] FALSE
## [1] TRUE
## [1] FALSE
ランダムサンプリング(既出)です。実行のたびに結果は変わります。
## [1] 2 3
## [1] 2 3
引数を明示して関数を実行します。(x と size
は引数の名前として指定) 名前が無いもの(1:4)は、x
として扱われます。 sample の場合、x
が引数のデフォルト値です。
## [1] 2 1
## [1] 3 4
関数の引数の名前(および引数のデフォルト値 + 引数の順序)は
args で調べます。
## function (x, size, replace = FALSE, prob = NULL)
## NULL
## function (x, values, after = length(x))
## NULL
replace
は、同一の値のサンプリングを許可するかを指定します。
## [1] 4 2 2 1
## [1] 2 2 4 3
名前がなければ、2番目の引数は size
が期待されるため、エラーとなります。
## Error in sample.int(length(x), size, replace, prob): 'size' 引数が不正です
誤った引数の名前も、エラーとなります。
## Error in sample(1:4, saizu = 2): 使われていない引数 (saizu = 2)
NA は「値がない(不明)」ことを表す特別な値です。
(3.4)で、範囲外の添字を指定したときにも NA
が返りました。
## [1] 3 NA 5
NA を含む計算の結果は、NA になります。
## [1] NA
## [1] NA
## [1] NA
na.rm=TRUE を指定すると、NA
を取り除いて計算します。
## [1] 8
## [1] 4
NA かどうかは、== ではなく
is.na() で調べます。
## [1] NA NA NA
## [1] FALSE TRUE FALSE
## [1] 3 5
## [1] 1
(参考)NULL
は「何もない(空)」ことを表し、長さは0です。NA
は長さ1の値です。
## [1] 1
## [1] 0
アトミックベクトルを、2行3列の配列に変換します。
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
## [1] TRUE
## [1] TRUE
## [1] 6
配列の要素は、行と列の添字で指定できます。
## [1] 2
## [1] 6
## [1] 4
## [1] 5
行や列をまとめて取り出すこともできます。
## [1] 2 4 6
## [1] 5 6
## [,1] [,2]
## [1,] 1 5
## [2,] 2 6
1+1の結果を3回繰り返し、ベクトルにします。
## [1] 2 2 2
サイコロの無作為抽出を10回繰り返します。
## [1] 1 6 2 1 5 6 4 6 1 2
このとき、a
は配列ではなく、単なる(一次元)ベクトルです。
## [1] FALSE
要素数n(>1)のベクトルを返す関数をm回 replicate
すると、結果はn x mの配列となります。
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 4 6 4 4 2 3 5 6 4 2
## [2,] 5 1 1 6 3 4 6 2 5 4
## [1] TRUE
## [1] TRUE
## [1] 20
1:6 に含まれる個々の要素を a とし、a
を出力します(print 関数)。
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
for(a in vec) の a
は、必ずしも使う必要はありません。
以下は、サイコロの無作為抽出を5回繰り返したものの加算を計算したものです。
Rでは「+=」の記法は使えません。
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
サイコロの総和が50以上となるまで加算します(while)。
## [1] 3
## [1] 8
## [1] 9
## [1] 11
## [1] 16
## [1] 21
## [1] 26
## [1] 32
## [1] 34
## [1] 39
## [1] 45
## [1] 48
## [1] 52
repeat は、while(TRUE) に相当します。
break が実行されるまで、永遠に実行します。
(ここで使っている if
は、次の(7.4)で詳しく学びます。)
## [1] 4
## [1] 6
## [1] 8
## [1] 9
## [1] 14
## [1] 18
## [1] 19
## [1] 24
## [1] 27
## [1] 28
## [1] 30
## [1] 33
## [1] 39
## [1] 41
## [1] 45
## [1] 46
## [1] 50
条件が TRUE のときだけ処理を実行するには if
を使います。
## [1] "3より大きい"
else を使うと、条件が FALSE のときの処理も書けます。
## [1] "3以下"
(else は、直前の }
と同じ行に書きます。)
条件は else if でいくつでも重ねられます。
## [1] 5
## [1] "まずまず"
for
文と組み合わせると、繰り返しの中で条件を判定できます。
# サイコロを2個振る操作を5回繰り返し、ゾロ目のときだけメッセージを出す
for(i in 1:5){
d = sample(1:6, size=2, replace=TRUE)
print(d)
if(d[1] == d[2]){
print("ゾロ目!")
}
}## [1] 2 3
## [1] 6 1
## [1] 4 2
## [1] 4 4
## [1] "ゾロ目!"
## [1] 1 1
## [1] "ゾロ目!"
注意:if
の条件には、長さ1の論理値しか使えません。
複数の要素を持つベクトルを渡すとエラーになります。
## Error in if (x > 3) {: the condition has length > 1
2つの条件を組み合わせるときも、if の中では
&&(かつ)と ||(または)を使います。
& と |
は、ベクトルの要素ごとの演算に使います。
## [1] "3より大きい偶数"
ベクトルの要素ごとに条件を判定して値を切り替えるには、ifelse(条件, TRUEのとき, FALSEのとき)
を使います。
## [1] "小" "小" "小" "大" "大" "大"
## [1] "奇数" "偶数" "奇数" "偶数" "奇数" "偶数"
## [1] 3 3 2 3 3 4 6 1 6 4
## [1] "低" "低" "低" "低" "低" "高" "高" "低" "高" "高"
ifelse
は、次回以降に学ぶデータフレームの列を作るときにも、形を変えて何度も登場します。
2個のサイコロを振って、総和を得るプログラムです。
## [1] 5
これを roll() として関数化します。
関数定義の最後の行が返り値となります。 基本的に、return
は書きません。
## [1] 8
## [1] 6
## [1] 9
n個のサイコロを振って、総和を得るプログラムです。 引数ありの関数をつくります。
ただし、関数の途中で処理を打ち切って値を返したいときには、return()
を使います。 return()
が実行された時点で、関数はそこで終了します。
roll.safe = function(n){
if(n < 1){
return(NA) # ここで関数を終了し、NAを返す
}
dice = 1:6
dice2 = sample(dice, size=n, replace = TRUE)
sum(dice2) # 最後の行が返り値
}
roll.safe(3)## [1] 14
## [1] NA
サイズ10の、全ての要素がゼロのベクトルを生成します。
result = vector("integer",10)
result = vector(mode="integer",length=10) #同じです
for(i in 1:10){
result[i] = roll.n(i)
}
result## [1] 5 8 8 19 14 22 24 19 27 31
roll
関数を1000回繰り返し、一次元ベクトルに格納します。
## [1] 8 4 3 9 4 10 7 8 10 4 9 10 5 6 9 4 6 7 8 5 5 6 6 9 6
## [26] 6 7 10 8 6 5 11 5 6 6 12 10 8 5 10 4 5 5 11 4 7 6 11 11 4
for 文で書き直すこともできます(同じことです)。
roll 関数を使って、ヒストグラムを計算します。
中身が0の、長さ12のベクトルをつくります。
imax = 10000
rolls = replicate(imax, roll())
hi=vector("integer",12)
for(i in 1:imax){
hi[rolls[i]] = hi[rolls[i]]+1
}
hi## [1] 0 273 514 900 1077 1425 1719 1388 1069 770 580 285
この結果を、棒グラフ(barplot)で可視化します。
main はタイトルnames.arg はx軸の値ylab はy軸のラベルhist
関数を使うと、サンプルベクトルから自動でヒストグラムを生成できます。
breaks は区切りのベクトルxlim/ylim はx/yの範囲