R入門
数学
最終更新:
r-intro
目次
絶対値を求める
abs関数を使う。引数には数値型ベクトルを与える。
平方根を求める
sqrt関数を使う。
> sqrt(2)
[1] 1.414214
> sqrt(3)
[1] 1.732051
> sqrt(4)
[1] 2
> sqrt(0)
[1] 0
> sqrt(1 / 2)
[1] 0.7071068
> sqrt(-2)
[1] NaN
警告メッセージ:
sqrt(-2) で: 計算結果が NaN になりました
累乗を求める
^演算子か**演算子を使う。
> 2 ^ 3
[1] 8
> 2 ^ 0.5
[1] 1.414214
> 2 ^ -4
[1] 0.0625
> -3 ^ 3
[1] -27
> 2 ** 3
[1] 8
> 2 ** 0.5
[1] 1.414214
> 2 ** -4
[1] 0.0625
> -3 ** 3
[1] -27
「累乗」と「べき乗(冪乗)」について
各文献における「累乗」と「べき乗(冪乗)」の扱いは以下のとおり。「累乗」と「べき乗(冪乗)」は同義語だが、「累乗」の使用を推奨する。
「累乗」 | 「べき乗」 | |
数学小辞典 第2版増補(共立出版) | ◎ | △ |
数学小辞典(共立出版) | 〇 | × |
明鏡国語辞典 第3版(大修館) | 〇 | × |
新明解国語辞典 第7版(三省堂) | ◎ | × |
◎:見出しに有り、説明文中にべき乗ともと記載。
〇:見出しに有り、説明文中にべき乗については言及せず。
△:見出しに有るが、説明は無く累乗を参照と記載。
×:見出しに無し。
数列を求める
seqコマンドを使う。引数は1~3つ与えることができ、それぞれ以下のようになる。最後の例のとおり、最後に公差を加えて末項に一致しない場合は、その1つ前の項までが作成される。
- seq(初項)
- seq(初項, 末項) ※公差は1
- seq(初項, 末項, 公差) ※末項に届かないときはその1つ前の項まで
> seq(3)
[1] 1 2 3
> seq(2, 5)
[1] 2 3 4 5
> seq(3, 12, 4)
[1] 3 7 11
負数や実数の指定も可能。
> seq(-1, -11, -2)
[1] -1 -3 -5 -7 -9 -11
> seq(1.2, 2.8, 0.4)
[1] 1.2 1.6 2.0 2.4 2.8
順列を求める
Rには標準では順列の総数を求める関数は搭載されていない。階乗を使った式で表すことができるため、階乗を求めるfactorial関数を使用して、順列の総数を求める関数permuを自作する。
> permu <- function(n, r) {factorial(n) / factorial(n - r)}
5 P 2 (=20)、 5 P 3 (=60)を求めてみる。
> permu(5, 2)
[1] 20
> permu(5, 3)
[1] 60
なおn > r、0!=1である。n=rの場合は、階乗そのものの計算になる。
組合せを求める
choose関数を使う。n個からr個とった組合せの総数を求める。
5 C 2 (=10)、 7 C 3 (=35)、 10 C 2 (=45)を求めてみる。
> choose(5, 2)
[1] 10
> choose(7, 3)
[1] 35
> choose(10, 2)
[1] 45
三角関数の値を求める
cos関数(余弦関数)、sin関数(正弦関数)、tan関数(正接関数)を使う。角θの値が、次の各値の時、cosθ、sinθ、tanθを求めてみる。
θ=0, π/2, π, 2π
> theta <- c(0, pi / 2, pi, 2 * pi)
> cos(theta)
[1] 1.000000e+00 6.123032e-17 -1.000000e+00 1.000000e+00
> sin(theta)
[1] 0.000000e+00 1.000000e+00 1.224606e-16 -2.449213e-16
> tan(theta)
[1] 0.000000e+00 1.633124e+16 -1.224647e-16 -2.449294e-16
~-17や~-16は計算上限りなく小さい値が求まった(≒0.0)ということであり、実際にそのような値が精度良く求まったということではない。~+16(≒∞)も同様である。
対数の値を求める
log関数を使う。aを底とするNの対数の求め方は以下のとおり。
log(N, a)
log 3 3(=1)、log 5 1(=0)、log 3 243(=5)の値をそれぞれ求める。
底は省略することができる。その場合はeを底とする自然対数が求まる。
常用対数(10を底とする対数)を求めるlog10関数、2を底とする対数を求めるlog2関数もある。
代数方程式の根を求める
polyroot関数を使う。以下は2x 3 +3x 2 +8x-5=0の3つの根(0.5,-1+2i,-1-2i)を求めた例。虚部も求めることができる。引数には、次数の低いほうから係数をベクトルでまとめて与える(この場合はc(-5,8,3,2)となる)。
> polyroot(c(-5, 8, 3, 2))
[1] 0.5+0i -1.0+2i -1.0-2i
戻り値は複素数型。複素数型から実部だけを取り出すにはRe関数を、虚部だけを取り出すにはIm関数を使う。これら関数の戻り値はそれぞれ実数型。
> class(d)
[1] "complex"
> Re(d)
[1] 0.5 -1.0 -1.0
> Im(d)
[1] 3.372483e-16 2.000000e+00 -2.000000e+00
> class(Re(d))
[1] "numeric"
> class(Im(d))
[1] "numeric"
微分する
ある式を関数と見なして、その式(関数)の導関数を求める(微分する)ことができる。expression関数とD関数を併用する。
以下はxの4乗を微分した例。手計算では「xの4乗」を微分すれば、「4かけるxの3乗」になる。
> f <- expression(x ^ 4)
> D(f, "x")
4 * x^3
いろいろな関数も微分できる。例えばsin(3x-2)を微分する。手計算では微分をすると3cos(3x-2)になる。
式には定数を含めることもできる。
> f <- expression(a * x ^ 3)
> D(f, "x")
a * (3 * x^2)
定積分を求める
integrate関数を使う。引数は以下のとおり
integrate(関数, 積分の下端, 積分の上端)
関数はfunction関数で定義しておくこと。
以下は、x^2を0から1まで、0から2まで積分した例。手計算で定積分はそれぞれ1/3,8/3である。
> f <- function(x) x ^ 2
> integrate(f, 0, 1)
0.3333333 with absolute error < 3.7e-15
> integrate(f, 0, 2)
2.666667 with absolute error < 3e-14
三角関数などのように定義済みの関数はそのままでも使うことができる。既存の関数を使用して関数を定義することもできる。
> integrate(cos, 0, pi / 2)
1 with absolute error < 1.1e-14
> f <- function(x) cos(x)
> integrate(f, 0, pi / 2)
1 with absolute error < 1.1e-14
置換積分法が必要な積分も、簡単に行える。下記の例では、手計算で定積分は8/sqrt(2)=5.656854…である。
二つの集合MとNの共通部分M∩Nと和集合M∪Nを得る
共通部分(どちらにも属している要素の集合)M∩Nを得るにはintersect関数を、和集合(少なくとも一方に属する要素の集合)M∪Nを得るにはunion関数を得る。以下、例。
> m <- seq(2, 18, by = 2)
> n <- seq(3, 18, by = 3)
> print(m)
[1] 2 4 6 8 10 12 14 16 18
> print(n)
[1] 3 6 9 12 15 18
> union(m, n)
[1] 2 4 6 8 10 12 14 16 18 3 9 15
> intersect(m, n)
[1] 6 12 18
ベクトルの要素に対して行う処理のため、当然、要素が数値以外でもかまわない。
> s1 <- c("スーパークリーク", "メイショウドトウ", "サクラチヨノオー")
> s2 <- c("メイショウドトウ", "サクラチヨノオー", "メジロアルダン")
> union(s1, s2)
[1] "スーパークリーク" "メイショウドトウ" "サクラチヨノオー" "メジロアルダン"
> intersect(s1, s2)
[1] "メイショウドトウ" "サクラチヨノオー"
ベクトルの要素について累積の和を求める
ベクトルの要素の値をインデックス順に足した累積の値を得るには、cumsum関数を使う。
> i <- 1:10
> i
[1] 1 2 3 4 5 6 7 8 9 10
> cumsum(i)
[1] 1 3 6 10 15 21 28 36 45 55
ベクトルの要素について累積の積を求める
ベクトルの要素の値をインデックス順に掛けた累積の値を得るには、cumprod関数を使う。順番に要素を掛けるだけのため、最後の例のように要素の値をすべて同じにすれば、単純に累乗が求まることになる。
> i <- 1:5
> i
[1] 1 2 3 4 5
> cumprod(i)
[1] 1 2 6 24 120
> i <- rep(2, 8)
> i
[1] 2 2 2 2 2 2 2 2
> cumprod(i)
[1] 2 4 8 16 32 64 128 256