R入門
数と式
最終更新:
r-intro
目次
数
簡単な計算
計算は、演算子を使って簡単に行える。
> 1 + 2
[1] 3
> 3 - 4
[1] -1
> 5 * 6
[1] 30
> 7 / 8
[1] 0.875
> 9 + 1 + 2
[1] 12
演算子には優先順位がある。特に指定しない場合は優先順位が上位の演算子から計算される。例えば、現実の世界では+(足し算)より、×(掛け算)のほうが優先されるが、Rの世界でもそのようになる。その優先順位を変えたい場合は、優先して計算したい式を()「括弧」でくくる。
> 1 + 2 * 3
[1] 7
> 1 + (2 * 3)
[1] 7
> (1 + 2) * 3
[1] 9
数値型と数値リテラル
Rでよく使われる数値には2種類ある。
- 整数型
- 浮動小数点数型
1は整数を扱う。2はいわゆる実数を扱う。
整数型の数値ベクトルを作成するには、as.integer関数を使う。浮動小数点数型の数値ベクトルとはas.double関数を使う。
> n <- as.integer(3)
> d <- as.double(4.5)
> typeof(n)
[1] "integer"
> typeof(d)
[1] "double"
ここで、式や関数の引数で使う、3や4.5といった数値を表したものを数値リテラルという。3は整数リテラル、4.5は浮動小数点数リテラルという。だが、Rでは通常の計算は全て浮動小数点数で扱われるため、整数や浮動小数点数といったことを意識することはあまりない。
> typeof(3)
[1] "double"
> typeof(4.5)
[1] "double"
これまでベクトルのインデックスには演算子[ ]を使用して数値型ベクトルを与えて使用してきたが、与える数値は明示的に整数型にしなくてもよい。この場合は、与えた数値型ベクトルの要素は強制的に整数されてしまう(小数点以下が無視される)。
> s <- c("A", "B", "C")
> s[c(2, 3)]
[1] "B" "C"
> s[c(2.1, 3)]
[1] "B" "C"
> s[c(2.1, 3.9)]
[1] "B" "C"
これは浮動小数点数型を与えてもよいと理解せずに、ベクトルのインデックスには整数リテラルを与えるようにすること。
文字列から数値を作成する
as.numeric関数を使う。Rでは数値の扱いはデフォルトでは浮動小数点数(実数)のため、特に指定しない限り整数を表す文字列は浮動小数点数として扱われる。これを整数として扱うにはas.integer関数を使う。as.double関数はas.numeric関数と同じである。
> s <- c("0", "1", "-2", "3.14")
> print(s)
[1] "0" "1" "-2" "3.14"
> as.numeric(s)
[1] 0.00 1.00 -2.00 3.14
> as.integer(s)
[1] 0 1 -2 3
> as.double(s)
[1] 0.00 1.00 -2.00 3.14
> as.numeric(c("0", "1", "-2", "3.14", "abc"))
[1] 0.00 1.00 -2.00 3.14 NA
警告メッセージ:
強制変換により NA が生成されました
最後の例のとおり、数値を表さない文字列の場合は警告が発生し、数値ではなく強制的にNAに変換される。
切り上げ切り捨て
小数点以下の切り捨てを行う
trunc関数を使う。
> sprintf("%.5f", trunc(c(1.23, -1.23, 0.1, -0.1)))
[1] "1.00000" "-1.00000" "0.00000" "-0.00000"
似たような機能を持つfloorという関数もある。こちらは、その数より小さい最大の整数を返す。
小数点以下の切り上げを行う
ceiling関数を使う。厳密には、その数より大きい最小の整数を返すことに注意。
> sprintf("%.5f", ceiling(c(1.23, -1.23, 0.1, -0.1)))
[1] "2.00000" "-1.00000" "1.00000" "-0.00000"
小数点以下の四捨五入を行う
round関数を使う。JIS規格 (JIS Z 8401) による偶数丸めであることに注意。
> sprintf("%.5f", round(c(1.3, 1.4, 1.5, 2.3, 2.4, 2.5)))
[1] "1.00000" "1.00000" "2.00000" "2.00000" "2.00000" "2.00000"
指定した桁で数値を丸める
round関数を使う。第一引数には対象となる数を、第二引数には丸める判定を行う小数点以下第何位の数かを指定する。
> sprintf("%.5f", round(c(1.23, 1.24, 1.25, 2.23, 2.24, 2.25), 1))
[1] "1.20000" "1.20000" "1.20000" "2.20000" "2.20000" "2.20000"
n進数
n進数を10進数に変換する
strtoi関数を使う。第一引数に変換したいn進数を文字列で、第二引数に変換したいn進数のnの値を整数で与える。
> strtoi(c("1", "10", "100"), 2L)
[1] 1 2 4
> strtoi(c("1", "10", "100"), 10L)
[1] 1 10 100
> strtoi(c("1", "10", "100"), 16L)
[1] 1 16 256
> strtoi(c("f", "ff", "fff"), 10L)
[1] NA NA NA
> strtoi(c("f", "ff", "fff"), 16L)
[1] 15 255 4095
> mode(strtoi(c("1", "10", "100"), 16L))
[1] "numeric"
> class(strtoi(c("1", "10", "100"), 16L))
[1] "integer"
変換できない文字列の場合はNAが返される。戻り値は数値型(整数)。
16進数で計算をする
数値リテラルに0xを付けて計算するかas.hexmode関数を使う。0xを付けて計算をすると戻り値は10進数かつ数値型。as.hexmode関数の戻り値を含めると、戻り値は16進数かつ文字列になることに注意。
> 9 + 2
[1] 11
> 0x9 + 0x2
[1] 11
> 0x9 + 2
[1] 11
> 0xb
[1] 11
> as.hexmode("9") + as.hexmode("2")
[1] "b"
> as.hexmode("9") + 2
[1] "b"
文字列の16進数を10進数に変換する
as.integer関数とas.hexmode関数を組み合わせる。as.hexmode関数は引数に与えた文字列をhexmodeという種類の値に変換し、as.integer関数で整数に変換している。
> as.hexmode("f")
[1] "f"
> class(as.hexmode("f"))
[1] "hexmode"
> as.integer(as.hexmode("f"))
[1] 15
> as.integer(as.hexmode("ff"))
[1] 255
> as.integer(as.hexmode("ff")) + 1
[1] 256
任意の進数表記の文字列を任意の進数に変換する
strtoi関数を使う。baseオプションに変換したい進数の値(2進数なら2、10進数なら10、・・・)を与える。
> strtoi("01111", base = 10)
[1] 1111
> strtoi("01111", base = 2)
[1] 15
> strtoi("f", base = 16)
[1] 15
> strtoi("ff", base = 16)
[1] 255
10進数を16進数に変換する
as.hexmode関数を使う。ベクトルを扱うことができる。戻り値は画面表示では文字列に見えるが、整数であることに注意。
> as.hexmode(0:15)
[1] "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "a" "b" "c" "d" "e" "f"
> as.hexmode(249:255)
[1] "f9" "fa" "fb" "fc" "fd" "fe" "ff"
> as.hexmode(13:16)
[1] "0d" "0e" "0f" "10"
> as.hexmode(13:16) + 1
[1] "0e" "0f" "10" "11"
> typeof(as.hexmode(13:16))
[1] "integer"
様々な数
複素数を使う
complex型ベクトルを使う。complex関数で簡単に作ることができる。第一引数には作成するベクトルの個数、第二引数には実部の値、第三引数には虚部の値を与える。
以下は、2+3iを作成した例。
> ri <- complex(1, 2, 3)
> print(ri)
[1] 2+3i
四則演算や累乗は、実数と同じ演算子を使用して簡単に計算することができる。
> ri1 <- complex(1, 3, -2)
> ri2 <- complex(1, 2, 5)
> print(ri1)
[1] 3-2i
> print(ri2)
[1] 2+5i
> print(ri1 + ri2)
[1] 5+3i
> print(ri1 - ri2)
[1] 1-7i
> print(ri1 * ri2)
[1] 16+11i
> ri <- complex(1, 1, 1)
> print(ri)
[1] 1+1i
> print(ri ^ 4)
[1] -4+0i
戻り値は複素数型。複素数型から実部だけを取り出すにはRe関数を、虚部だけを取り出すにはIm関数を使う。これら関数の戻り値はそれぞれ実数型。
> ri <- c(complex(1, 2, 3), complex(1, 4, 5))
> print(ri)
[1] 2+3i 4+5i
> class(ri)
[1] "complex"
> Re(ri)
[1] 2 4
> Im(ri)
[1] 3 5
> class(Re(ri))
[1] "numeric"
> class(Im(ri))
[1] "numeric"
> Re(ri) + Im(ri)
[1] 5 9
ランダムに作成された整数からなる数値型ベクトルを作成する
runif関数とtrunc関数を組み合わせて使う。runif関数はrunif(n, a, b)とすると、a < x < bなるxがn個からなる数値型ベクトルを返す。trunc関数は引数に与えた数値の小数点以下を切り捨てて返す関数(正数も負数も0に寄せる方向に切り捨てる)。
runif関数のヘルプには以下のような記述があり、指定した範囲は原則開区間(両端の値を含まない区間)になることに注意。
runif will not generate either of the extreme values unless max = min or max-min is small compared to min, and in particular not for the default arguments.
以下は、無作為抽出により0~10の11個の整数からなる、要素数が5の数値型ベクトルを作成した例。runif関数の第1引数に指定した数だけ乱数が作成される。上記のとおりrunif関数に指定の範囲は開区間のため、runif関数の第3引数には1加えた11を指定していることに注意。最後はtable関数で100万個の整数を作成した際の度数分布表を表示しており、0~10から均等に抽出されていることがわかる。