== 統計用フリーソフトR の基本操作 == R version 4.0.3 (2020-10-10) ----- 最終更新年月日:2021.1.16 1. 算術演算
(1) コンピュータに数値として認識されるためには,半角文字(1バイトのアスキー文字)数字で書かなければならない.全角文字で書かれた数字は,(2バイト文字の1, 2など)数値として認識されない.
(2) 数値と演算子の間に「半角スペース」「全角スペース」があっても無視される.
むしろ,一続きの変数名などと紛らわしくないように,見やすく,間違いにくく書くには,数値や変数などと演算子の間には「半角スペースを1つ入れる」という書き方に揃える流儀がお勧め.
(3) C言語やJavascriptなどとは異なり,インクリメント,デクリメント演算子(++, −−)は使わない.
2つ以上の演算子を続けて用いた場合,3++4は3+(+4),3+−4は3+(−4),3−−4は3−(−4),3+−+4は3+(−(+4)),3−+−4は3−(+(−4))というように,先頭の+または−を演算子と解釈し,他は符号と解釈されるようだ.ただし,紛らわしいのでこのよう書き方は,お勧めしない. 先頭のみ演算子で残りは符号という意味では,3+*4はエラー,3*+4は3*4に等しい,3+/4はエラー,3/+4は3/4に等しい,3*/4はエラーになる. ただし,累乗(べき乗)として,3**4は3^4に等しいものとみなされる.3**(1/2)は3の正の2乗根,すなわち√3=1.732051(7桁までの小数)になる. |
1.1 足し算
【例1.1.1】 > 1+2 [1] 3 【例1.1.2】 > 3+(-4)+0.7 [1] -0.3 1.2 引き算
【例1.2.1】 > 2-5 [1] -3 【例1.2.2】 > 2-(-5)-0.7 [1] 6.3 1.3 掛け算
【例1.3.1】 > 3*4 [1] 12 【例1.3.2】 > 3 * (-4) * 0.5 [1] -6 1.4 割り算
【例1.4.1】 > 14/4 [1] 3.5 【例1.4.2】 > 14/3 [1] 4.666667
割り算の演算 / を使うと,割り切れたら整数で,有限小数になるときは有限の桁まで,無限小数になるときは小数が返される(表示上は7桁まで,ただし内部的に保持している桁数はもっと大きい).
【例1.4.3】 > 4/(3*5) [1] 0.2666667 【例1.4.4】 > 4/3/5 [1] 0.2666667
2つの数で割る(2回割るときは)【例1.4.3】の書き方よりも【例1.4.4】の書き方をよく見かける.
1.5 累乗
Rで「aのb乗」というべき乗(累乗)を表すにはa^bを使う.a**bも可能.【例1.5.1】 > 3^4 [1] 81 【例1.5.2】 > 3**(1/2) [1] 1.732051 |
1.6 整数割り算の商と余り
(1) 14÷3の割り算を「整数割り算」として行うとは,
Rでは,整数割り算a÷b=q···rの商qは演算子%/%を使って,a %/% bによって求められる.余りrは演算子%%を使って,a %% bによって求められる.
割られる数(被除数)a,割る数(除数)bの両方とも正の整数の場合,次のように商と余りを定める.
a=bq+r
0≦r<b 【例1.6.1】 商 > 14%/%3 [1] 4 余り > 14%%3 [1] 2
割られる数(被除数),割る数(除数)のどちらかが
ア)負の数である場合
の整数割り算については,商や余りの定義が処理系ごとに異なる.どれかが正しくてどれかが間違いということではなくて「各処理系ごとの割り算の定義の違い」「結果をどの様に使いたいのかなどの事情の違い」であると考えるとよい.イ)小数,分数である場合 |
(2) 被除数,除数が正負の整数である場合の整数割り算
a÷b=q···r ⇔ a=bq+r,qは整数
•小数a/bを超えない最大の整数をq=[a/b]とする.(ガウス記号) •R, Python, Excelでは,余り(r)の符号は除数(b)の符号と一致する. •Javascriptでは,余り(r)の符号は被除数(a)の符号と一致する.
***《Rの場合》***
@ 正の数÷正の数の場合 14 %/% 3 → 4 … これは,floor(14/3)に等しい 14 %% 3 → 2 となる.⇔ 14 = 3×4+2 A 負の数÷正の数の場合 −14 %/% 3 → −5 … これは,floor(-14/3)に等しい −14 %% 3 → 1 となる.⇔ −14 = 3×(−5)+1 B 正の数÷負の数の場合 14 %/% (−3) → −5 … これは,floor(14/(−3))に等しい 14 %% (−3) → −1 となる.⇔ 14 = (−3)×(−5)+(−1) C 負の数÷負の数の場合 −14 %/% (−3) → 4 … これは,floor(−14/(−3))に等しい −14 %% (−3) → −2 となる.⇔ −14 = (−3)×4+(−2) |
(3) 被除数,除数が正負の小数・分数である場合の整数割り算 割る数や割られる数が小数や分数の場合でも,整数割り算と同様の計算を定義することができる.
(注意)
結果を小数で表す割り算において,14.7/3.1は147/31と同じであるが,整数割り算においては,14.7÷3.1と147÷31は同じではない. すなわち, 147=31×4+23に対して,14.7=3.1×4+2.3であるから,商は等しいが余りが異なる. 下記の表は,被除数,除数とも整数とした場合から,「余りのみ小数に変えた」ものに等しい.
|
***《Rの場合》***
@ 正の数÷正の数の場合 14.7 %/% 3.1 → 4 … これは,floor(14.7/3.1)に等しい 14.7 %% 3.1 → 2.3 となる.⇔ 14.7 = 3.1×4+2.3 A 負の数÷正の数の場合 −14.7 %/% 3.1 → −5 … これは,floor(-14.7/3.1)に等しい −14.7 %% 3.1 → 0.8 となる.⇔ −14.7 = 3.1×(−5)+0.8 B 正の数÷負の数の場合 14.7 %/% (−3.1) → −5 … これは,floor(14.7/(−3.1))に等しい 14.7 %% (−3.1) → −0.8 となる.⇔ 14.7 = (−3.1)×(−5)+(−0.8) C 負の数÷負の数の場合 −14.7 %/% (−3.1) → 4 … これは,floor(−14.7/(−3.1))に等しい −14.7 %% (−3.1) → −2.3 となる.⇔ −14.7 = (−3.1)×4+(−2.3) |
2. 演算の優先順位
算術計算の優先順位(番号の小さいものほど優先)
(1) かっこ・・・ ( )
(2) べき乗,累乗・・・ ^ または ** (3) 整数割り算・・・ 商%/%, 余り%% (4) 掛け算,割り算・・・ * , / (5) 足し算,引き算・・・ + , − 【例2.1】 > 2+3*4 [1] 14 【例2.2】 > 5-6/3+4 [1] 7
掛け算(*)は足し算(+)よりも優先順位が高いので,先に3*4→12の計算を行い,次に2+12→14となる
割り算(/)は引き算(−)や足し算(+)よりも優先順位が高いので,先に6/3→2の計算を行い,次に5−2+4の計算を行う.
5−2と2+4とでは,引き算と足し算の優先順位が同じなので,左から順に行い5−2→3, 3+4→7となる 【例2.3】 > -5^2 [1] -25 【例2.4】 > (-5)^2 [1] 25
単項演算子:符号の(−)とべき乗,累乗の(^)とでは,べき乗,累乗の方が優先順位が高いので,先に5^2→25を求めてから,単項演算子:符号の(−)を付ける.結局,−25になる
Excelでは,単項演算子:符号の(−)が優先なので,−5^2→(−5)×(−5)→25となる.その処理系ごとの約束・癖の違いに注意しておく必要がある
べき乗,累乗の(^)とかっこ( )とでは,かっこの方が優先順位が高いので,先に−5としてから,次にその2乗:(−5)×(−5)→25を求める
|
【例2.5】 > x=-5 > x^2 [1] 25 【例2.6】 > x=-2 > 3^x^2 [1] 81
変数xに−5を代入すると,xは1つの数を表す.このときx^2は負の数(−5)^2→25を表しており,−と5を別々にして5だけ2乗した−5^2にはならない
xは1つの数−2を表す.次に,a^b^cはべき乗,累乗のb^cが優先されて,a^(b^c)を表す.(a^b)^cではない.
3^((−2)^2)→3^4→81になる
《読み物・・・昔の常識,今の非常識》
@小学校の常識 小学校算数で掛け算,割り算を習う.高学年になると,割り切れない割り算の結果は分数で表せる.そこで 割り切れない小数は最後の桁で「丸められる」から,元には戻らない 割ってから掛けても「生き返る」・・・R, Python, Excel, Javascriptのいずれも
※実演でやって見ると,
0.3333333 * 3 = 0.9999999 (7桁の3 → 7桁の9), 0.33333333 * 3 = 1(8桁の3 → 1) 7桁,8桁あたりに取り扱いの境目があるようだ. |
3. ベクトルの定義,演算
3.1 ベクトルの定義
例えば,v1という名前のベクトルを作り,その要素を(1, 3, 5)とするには【例3.1.1】 > v1<-c(1, 3, 5) > v1 [1] 1 3 5
ベクトルを定義するには,複数個のデータを結合(Combination)させることを表す関数 c を用いて
c(1, 3, 5)
などと書く.このベクトルを,v1という名前にするにはv1<-c(1, 3, 5)のように「山括弧」+「ハイフン」という記号を使って代入する |
Rで代入を行う方法は他にもあり,次のいずれの方法でも,上記の【例*.1】と同じ結果を得る.
【例3.1.2】 > v1=c(1, 3, 5) > v1 [1] 1 3 5 【例3.1.3】 > c(1, 3, 5)->v1 > v1 [1] 1 3 5 【例3.1.4】 > assain("v1", c(1, 3, 5)) > v1 [1] 1 3 5
以上のように,代入する方法は幾つかあるが,自分が使うのは基本の【例1】に絞るとよい.⇒深く狭く
他の人が【例3.1.2〜3.1.4】で書いていても『そういうやり方もあったな』と,読めば分かる程度にしておくとよい.⇒浅く広く |
3.2 規則性のあるベクトルの作成
m:n・・・mからnまで1ずつ増やした数(減らした数)から成るベクトル
m:n (m<n)のときは1ずつ増やす
【例】 1:5 → c(1,2,3,4,5)と同じ【例】 v1<−3:6 → v1<−c(3,4,5,6)と同じ
m:n (m>n)のときは1ずつ減らす
【例】 3:−2 → c(3,2,1,0,−1,−2)と同じ【例】 v2<−9:5 → v2<−c(9,8,7,6,5)と同じ
始点終点が小数のときは,1ずつ増やして(減らして)行き,端数が出たら捨てる
【例】 1.2:4.5 < c(1.2, 2.2, 3.2, 4.2)と同じ【例】 v3<−5.4:1.1 < c(5.4, 4.4, 3.4, 2.4, 1.4)と同じ
[seqは,数列sequenceを記号化したもの]
seq(a, b, by=c)・・・aからbまでcずつ増加させる(減少させる) 上記のm:n(m<n)はseq(m, n, by=1)と同じ. m:n(m>n)はseq(m, n, by=−1)と同じ.
端数が出たら捨てる
【例】 seq(0, 5, by=2) → (0, 2, 4)になる【例】 v1<−seq(10, 5, by=−3) → (10, 7)になる 【例】 seq(1.2, 3.8, by=1.1) → (1.2, 2.3, 3.4)になる
seq(a, b, length=n)・・・初項a,末項b, 項数nの等差数列
区切り方によっては,小数になる場合もある
【例】 seq(1, 5, length=3) → (1, 3, 5)になる【例】 seq(1,2,length=4) → (1.000000, 1.333333, 1.666667, 2.000000)になる 【例】 seq(4,2,length=5) → (4.0, 3.5, 3.0, 2.5, 2.0)になる. |
rep(c(a, b,・・・ ), length=n)・・・ベクトルc(a, b,・・・ )を, 長さがn個になるまで繰り返す
【例】 rep(c(1,2,3),length=7) → (1, 2, 3, 1, 2, 3, 1)になる 【例】 rep(c(1,2,3,4,5), length=3) → (1, 2, 3)になる:長さ3までで打ち切り 【例】 rep(1:3, length=5) → (1, 2, 3, 1, 2)になる
rep(c(a, b,・・・ ), times=m)・・・ベクトルc(a, b,・・・ )を, m回繰り返す
【例】 rep(c(1,2),times=3) → (1, 2, 1, 2, 1, 2)になる 【例】 rep(1:3, times=c(2,3,4)) → (1,1,2,2,2,3,3,3,3)になる seq()関数,rep()関数には省略形もあるが,省略すると引数の表す内容が混乱しやすいので,お勧めしない. 【例】 rep(3, 4) → (3, 3, 3, 3)になる 3という1要素のベクトルを4回繰り返す 【例】 rep(3, 4, 5) → (3, 3, 3, 3, 3)になる 3という1要素のベクトルを5回繰り返す (第2引数の4は無視される) 【例】 rep(2, 3, 4, 5) → (2, 2, 2, 2)になる 2という1要素のベクトルを4回繰り返す (第2引数の3と第4引数の5は無視される) 【例】 rep(1.2, 2.3, 3.5) → (1.2, 1.2, 1.2)になる 1.2という1要素のベクトルを[3.5]=3回繰り返す (第2引数は無視される) ⇒ 込み入っていて覚えにくい. 【例】 rep(3, times=4, length=5) →(3, 3, 3, 3, 3) lengthとtimesとではlengthが優先される 【例】 rep(3, length=4, times=5) → (3, 3, 3, 3) lengthとtimesとではlengthが優先される 【例】 seq(3, 4) → (3, 4)になる 初項と末項の2つになる 【例】 seq(2, 3, 4) → (2)になる 初項だけになり,第2,第3引数は無視される 【例】 seq(2, 3, 4, 5) → エラーになる 引数が多過ぎる |
3.3 ベクトルのデータ型
ベクトルの要素のデータ型は,緩い方から厳しい方まで順に次のように並ぶ[緩い]:character>complex>numeric>logical:[厳しい] ベクトルの各要素はcharacter(文字列型),complex(複素数型),numeric(数値型),logical(論理型)の内の1つのデータ型でなければならない.
【例1】 ("tokyo", "oosaka", "nagoya")
character(文字列型),complex(複素数型),numeric(数値型),logical(論理型)のデータ型の異なる型が混ざっている場合,Rのベクトルとしては「それらの中の最も緩い型」に揃えた型に整える.→ 各要素がcharacter(文字列型)であるベクトル 【例2】(2+3i, 3−4i) → 各要素がcomplex(複素数型)であるベクトル 【例3】(1,2,3) → 各要素がnumeric(数値型)であるベクトル |
【例3.3.1】 > v1<-c(1,2,"ab") > v1 [1] "1" "2" "ab"⇒ 数値型と文字列型が混ざっていたので,文字列型に揃えられた 【例3.3.2】 > v1<-c(1, 2.3, 3.14) > v1 [1] 1.00 2.30 3.14⇒ 整数,小数点以下第1位まで,小数点以下第2位までの数値から成るベクトルでは,小数の桁数の最も長いものに揃えた第2位まで表示される. |
3.4 ベクトル要素の読み書き
3.4.1 ベクトル要素の読み出し
(1) そのベクトルの値を全部表示するには,コンソールでベクトル名を入力して、Enterキーを押せばよい.
【例3.4.1.1】
> v1<-c(5,-6,7)
> v1
[1] 5 -6 7
length(ベクトル名)とする.
【例3.4.1.2】
> week1<-c("Sun","Mon","Tue","Wed","Thu")
> length(week1)
[1] 5
n番目の要素を表示するには,ベクトル名[n]とする. 【例3.4.1.3】 > v1<-c(5, -6, 7) > v1[1] [1] 5⇒ 勧められる話ではないが,v1[2.5]とすると−6となる・・・項番号が小数で与えられた場合は,ガウス関数(引数を超えない最大の整数)で整数に直した番号と解されるということらしい.
nの要素からなるベクトルv1に対して,(A) v1[1]〜v1[n]は定義済み要素を表示する操作であるのに対して
(4) m番目の要素からn番目の要素までを表示するには
(B) p>nとなるpの値に対して,v1[p]と入力した場合
(B)(C)の場合は,定義済み要素を表示するという操作ではない.後の3.2(3)へ
(C) p≦0となるpの値に対して,v1[p]と入力した場合 ベクトル名[m:n]とする.
【例3.4.1.4】
> month<-c("Jan","Feb","Mar","Apr")
> month[2:3]
[1] "Feb" "Mar"
ベクトル名[c(p, q, r)]とする.
【例3.4.1.5】
> v2<-c("ab","cd","ef","gh","ij")
> v2[c(2,5,3)]
[1] "cd" "ij" "ef"
|
(6) p番目,q番目,r番目"以外"の要素を表示するには(ただし,元のベクトルからp番目,q番目,r番目の要素がなくなるわけではない)ベクトル名[c(−p, −q, −r)]とする.
【例3.4.1.6】
> v2<-c("ab","cd","ef","gh","ij")
> v2[c(-1,-3)]
[1] "cd" "gh" "ij"
> v2
[1] "ab" "cd" "ef" "gh" "ij" # v2自体は変化しない
次の例のように,負のベクトルの形でもこれと同じ結果が得られる.
【例3.4.1.7】
> v2<-c("ab","cd","ef","gh","ij")
> v2[-c(2,3)]
[1] "ab" "gh" "ij"
⇒ 2番目と3番目以外が表示される
【例3.4.1.8】
> v2<-c("ab","cd","ef","gh","ij")
> v2<-v2[c(-1,-3)]
> v2
[1] "cd" "gh" "ij"
⇒ 1番目と3番目の要素を取り除いたベクトルになる
【例3.4.1.9】
> v2<-c("x","y","z","w")
> v2<-v2[-c(1,2)]
> v2
[1] "z" "w"
⇒ 1番目と2番目の要素を取り除いたベクトルになる
(7) 条件に合う要素を表示するには,ベクトル名[条件式]とする.
《条件式の書き方の例》・・・ベクトル v1=(5,11,23,34)のとき
• (7.2)(7.4)(7.5)の複号は,間にスペースなどを書くとエラーになる:<=, >=, ==のように詰めて書いてなければならない • (7.2)(7.4)の複号は,逆順ではエラーになる:=>, =<はエラー • 上記の他に,論理積 &&, 論理和 || もあるが,これらは初めの要素について成り立てば,それ以降のチェックを行わないことになっている. |
3.4.2 ベクトル要素の追加
(1) ベクトル1の末尾にベクトル2を追加するには,append(ベクトル1, ベクトル2)とする. ただし,これでベクトル1が変化するわけではない.別のベクトルに代入するか,もしくは,ベクトル1に代入すれば,追加の操作は保存される. 【例3.4.2.1】 > w1<-c("Sun","Mon","Tue","Wed") > w2<-c("Thu","Fri","Sat") > append(w1,w2) [1] "Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat" > w1 [1] "Sun" "Mon" "Tue" "Wed" # w1自体は変化しない > w2 [1] "Thu" "Fri" "Sat" # w2も変化しない > w3<-c(w1,w2) # w3に代入すれば保存される > w3 [1] "Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat" > w1<-append(w1,w2) # この形ではw1が変化する > w1 [1] "Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat" (2) ベクトル1の第n番目の要素の後にベクトル2を追加するには,append(ベクトル1, ベクトル2, after=n)とする. ただし,これでベクトル1が変化するわけではない.別のベクトルに代入するか,もしくは,ベクトル1に代入すれば,追加の操作は保存される.
【例3.4.2.2】
> v1<-c("aa","ab","bb")
> append(v1, c("c1","c2"),after=2)
[1] "aa" "ab" "c1" "c2" "bb"
|
(3) (A) nの要素からなるベクトルv1に対して,v1[1]〜v1[n]は定義済み要素を表示する操作であるのに対して,
(B) p>nとなるpの値に対して,v1[p]<−値と入力した場合,新たにp番目の要素v1[p]が追加される.もし,元の要素数とpの間に隙間がある場合は,隙間の要素は NA(欠損値:Not Available)となり,ベクトルの要素数はpになる.
【例3.4.2.3】
> v1<-c(2,4,6)
> v1[5]<-9
> v1
[1] 2 4 6 NA 9
(C) p≦0となるpの値に対して,v1[p]<−値と入力した場合
例えば,v1[−2]<5と入力した場合,v1[−2]と書く第1段階で,3.1(6)の"ある要素以外"という書き方に解釈されてしまう.
【例3.4.2.4】
> v1<-c(3,6,9)
> v1[-2]
[1] 3 9 # 第2要素以外
【例3.4.2.5】
> v1<-c(3,6,9)
> v1[-2]<-5
> v1
[1] 5 6 5 # 第2要素以外は5になる
|
3.5 ベクトル要素の書き換え
ベクトル要素の書き換えについては,すでに幾つか登場しているが,replace( )関数も含めてここにまとめて記述する.3.5.1 ベクトル名[番号]の形で要素を書き換える
(1) [1つの要素の書き換え]ベクトルv1の第n要素の値をpに書き換えるには, v1[n] <− pとする. (ただし,"書き換え"になるのは,1≦n≦length(v1)の場合.3.4.2(3)で述べたように,n≦0の場合や,n>length(v1)の場合は,既存要素の書き換えではない.) 【例3.5.1.1】 > v1<-c(2,4,6,8) > v1[3]<-5 > v1 [1] 2 4 5 8※この書き方では,書き換えられたものが表示されるとともに,ベクトル自体も変化する (2) [2個以上の要素の書き換え] ベクトルv1の第m, n, ・・・要素の値をp, q, ・・・に書き換えるには,v1[c(m, n, ・・・)] <− c(p, q, ・・・)とする. [ここに,c(m, n, ・・・)は場所の束,c(p, q, ・・・)は値の束] 【例3.5.1.2 > v1<-c(2,4,6,8) > v1 [1] 2 4 6 8 > v1[c(3,1)]<-c(9,5) > v1 [1] 5 4 9 8※この書き方では,ベクトルも変化する |
3.5.2 replace( )関数を使って書き換える
(1) [1つの要素の書き換え]ベクトルv1の第n要素の値をpに書き換えるには, replace(v1, n, p)とする. 【例3.5.2.1】 > v1<-c(2,4,6,8) > replace(v1, 3, 7) #1 [1] 2 4 7 8 > v1 [1] 2 4 6 8 > v1<-c(2,4,6,8) > v1<-replace(v1,3,7) #2 > v1 [1] 2 4 7 8※#1の書き方では,書き換えられたものが表示されるが,ベクトルv1自体は変化しない.#2の書き方では,v1自体も変化する ベクトルv1の第m素をsに,第n要素をtに,・・・書き換えるには,replace(v1, c(m, n, ・・・), c(s, t, ・・・))とする. [ここに,c(m, n, ・・・)は場所の束,c(p, q, ・・・)は値の束] ただし,この操作によって元のベクトルv1は変わらないので,元のベクトルも書き換えるには,ベクトルv1に対する代入操作が必要:v1<−replace(v1, c(m, n, ・・・), c(s, t, ・・・))など 【例3.5.2.2】 > v1<-c(2,4,6,8,10) > v1 [1] 2 4 6 8 10 > replace(v1,c(5,2),c(7,1)) [1] 2 1 6 8 7 # 5番目は7に,2番目は1に > v1 [1] 2 4 6 8 10 # v1自体は変化しない > v1<-replace(v1,c(5,2),c(7,1)) > v1 [1] 2 1 6 8 7 # ベクトルv1も変化する |
3.6 ベクトルの演算
3.6.1 ベクトル間の四則演算および累乗の演算
ベクトル間に,二項演算として +, −, *, / を用いた場合,原則として「対応する要素間」に働く.
【例3.6.1.1】 > v1<-c(1,3,5) > v2<-c(2,3,4) > v1+v2 [1] 3 6 9⇒ ベクトルの足し算は,対応する要素の和を要素とするベクトルになる. 【例3.6.1.2】 > v1<-c(1,3,5) > v2<-c(2,3,4) > v1-v2 [1] -1 0 1⇒ ベクトルの引き算は,対応する要素の差を要素とするベクトルになる. 【例3.6.1.3】 > v1<-c(1,3,5) > v2<-c(2,3,4) > v1*v2 [1] 2 9 20⇒ ベクトルの掛け算は,対応する要素の積を要素とするベクトルになる. 数学におけるベクトルの積(内積)とは違うので注意 【例3.6.1.4】 > v1<-c(1,3,5) > v2<-c(2,3,4) > v1/v2 [1] 0.50 1.00 1.25⇒ ベクトルの割り算は,対応する要素の商を要素とするベクトルになる. 【例3.6.1.5】 > v1<-c(1,3,5) > v2<-c(2,3,4) > v1^2 [1] 1 9 25⇒ ベクトルの累乗は,対応する要素の累乗を要素とするベクトルになる. |
3.6.2 対応する要素の個数に過不足がある場合
ベクトル間の四則演算および累乗の演算において,「対応する要素の個数に過不足がある場合」
【例3.6.2.1】 > v1<-c(1,2,3,4,5,6) > v2<-c(7,8,9) > v1+v2 [1] 8 10 12 11 13 15⇒ 長い方(V1は要素が6個)が短い方(v2は要素が3個)の整数倍(この例では6÷3=2倍)になっている場合,短い方の要素を繰り返し使って埋めるものとして演算が行われる. この例では, (1,2,3,4,5,6)+(7,8,9,7,8,9)→(8,10,12,11,13,15) という計算になる 【例3.6.2.2】 > v1<-c(1,2,3) > v2<-c(4,5) > v1+v2 [1] 5 7 7 警告メッセージ: v1 + v2 で: 長いオブジェクトの長さが短いオブジェクトの長さ⇒ 長い方(V1は要素が3個)が短い方(v2は要素が2個)の整数倍になっていない場合,警告メッセージが表示され,エラーになる |
3.6.3 ベクトルの定数倍
ベクトルの定数倍は,数学の公式と同様になる.【例3.6.3.1】 > v1<-c(1,-3,5) > 2*v1 [1] 2 -6 10⇒ の形で使うことができる 【例3.6.3.2】 > v1<-c(1,-3,5) > v1*3 [1] 3 -9 15⇒ の形でも使うことができる 【例3.6.3.3】 ベクトルと定数との和 > v2<-c(-2, 3, 0) > v2+4 [1] 2 7 4⇒ (−2, 3, 0)+(4)の場合,長い方(V2は要素が3個)が短い方(4は要素が1個)の整数倍(3倍)になっているので,短い方の要素を繰り返し使って埋めて→(4, 4, 4)として演算が行われる. 【例3.6.3.4】 ベクトルとベクトルの差 > v3<-c(1,2,3,4) > v4<-c(3,1) > v3-v4 [1] -2 1 0 3⇒ (1,2,3,4)−(3,1)の場合,長い方(V3は要素が4個)が短い方(v4は要素が2個)の整数倍(2倍)になっているので,短い方の要素を繰り返し使って埋めて→(3,1,3,1)として演算が行われる. (1,2,3,4)−(3,1,3,1)→(−2,1,0,3) 【例3.6.3.5】 ベクトルとベクトルの差 > c(1,2,3)-c(2,4) [1] -1 -2 1 警告メッセージ⇒ 長い方(要素が3個)が短い方(要素が2個)の整数倍になっていないので,警告メッセージが表示され,計算の途中で打ち切られる. |
【例3.6.3.6】 ベクトルとベクトルの積 > v3<-c(1,2,3,4,5,6) > v4<-c(3,5) > v3*v4 [1] 3 10 9 20 15 30⇒ 長い方(V3は要素が6個)が短い方(v4は要素が2個)の整数倍(3倍)になっているので,短い方の要素を繰り返し使って埋めて→(3,5,3,5,3,5)として演算が行われる. ベクトルの積は,対応する要素の積で定義される(数学での内積や外積とは別のもの) (1,2,3,4,5,6)*(3,5,3,5,3,5)→(3,10,9,20,15,30) 【例3.6.3.7】 ベクトルとベクトルの積 > v3<-c(1,2,3,4) > v4<-c(4,5,6) > v3*v4 [1] 4 10 18 16 警告メッセージ⇒ 長い方(V3は要素が4個)が短い方(v4は要素が3個)の整数倍になっていないので,警告メッセージが表示され,計算の途中で打ち切られる. 【例3.6.3.8】 ベクトルとベクトルの商 > v5<-c(1,2,3) > 1/v5 [1] 1.0000000 0.5000000 0.3333333⇒ 長い方(V5は要素が3個)が短い方((1)は要素が1個)の整数倍に(3倍)になっているので,短い方の要素を繰り返し使って埋めて→(1,1,1)として演算が行われる. ベクトルの商[割り算の結果]は,対応する要素の商で定義される(数学にはベクトルの割り算はないが,Rでは対応する要素の割り算) 1/v5→(1,1,1)/(1,2,3)→(1/1, 1/2, 1/3) →(1.0000000, 0.5000000, 0.3333333) ※ベクトル要素の数値の表現は,最も長い桁数に揃えられる 【例3.6.3.9】 ベクトルのべき乗(累乗) > v6<-c(1,-2,3) > v7<-c(2,-3,0) > v6^v7 [1] 1.000 −0.125 1.000 > v6**v7 [1] 1.000 −0.125 1.000⇒ Rではベクトルの累乗[べき乗]は,対応する要素の累乗[べき乗]で定義される(数学の定義とは違う) →1.000 −0.125 1.000 ※ベクトル要素の数値の表現は,最も長い桁数に揃えられる v6**v7も全く同じ累乗[べき乗]を表す |
3.6.4 ベクトルの内積
(1) 数学において2つのベクトル,に対してで定義されるものをベクトルの内積という. RでベクトルX1, Y1の内積を計算するには,X1 %*% Y1もしくはsum(X1 * Y1)とする. 【例3.6.4.1】 > X1<-c(1,-2,3) > Y1<-c(2,4,6) > X1 %*% Y1 [,1] [1,] 12 # 1·2+(-2)·4+3·6=12 > sum(X1 * Y1) [1] 12 # 1·2+(-2)·4+3·6=12⇒ X1 * Y1は成分の積だから,その和を求めるとsum(X1*Y1)で内積になる |
(2) 2つのベクトルX1,Y1の要素数が異なるとき,X1 %*% Y1ではエラーとなる.sum(X1 * Y1)では,一方の要素数が他方の整数倍になっているとき,繰り返しによって埋められる(リサイクル規則が適用される).【例3.6.4.2】 > X2 [1] 1 2 > Y2 [1] 4 5 6 7 8 9 > X2 %*% Y2 X2 %*% Y2 でエラー: 適切な引数ではありません > sum(X2 * Y2) [1] 60 # 1·4+2·5+1·6+2·7+1·8+2·9=60 で定義される. RでベクトルX1の大きさ(長さ,ノルム)を求めるには,sqrt(X1 %*% X1)もしくはsqrt(sum(X1 * X1))とする. 【例3.6.4.3】 > X1<-c(1,-2,3) > sqrt(X1 %*% X1) [,1] [1,] 3.741657 # > sqrt(sum(X1*X1)) [1] 3.741657 |