PC用は別頁
=== 配色を変更したい場合 ===
◎外側の色を変えるには,次の色をクリック
◎内側の色を変えるには,次の色をクリック
標準文字色を変えるには,次の色をクリック
《自分用memo》
== 統計用フリーソフトR の基本操作 ==

R version 4.0.3 (2020-10-10)
----- 最終更新年月日:2021.1.16
1. 算術演算

演算記号
足し算+3 + 4
引き算3 − 4
掛け算*3 * 4
割り算/3 / 4
累乗^3 ^ 4
商と余り%/%, %%14 %/% 3, 14 %% 3
《全般に》
(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の割り算を「整数割り算」として行うとは,
14÷3=商が4,余りが2
の形で商と余りに分けて求めることをいう.
 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+rqは整数
•小数a/bを超えない最大の整数をq=[a/b]とする.(ガウス記号)
•R, Python, Excelでは,余り(r)の符号は除数(b)の符号と一致する.
•Javascriptでは,余り(r)の符号は被除数(a)の符号と一致する.
abR

q=a%/%b
余り
r=a%%b
Python

q=a//b
余り
r=a%b
Excel
余り
r=mod(a,b)

q=(a−r)/b
Javascript
余り
r=a%b

q=(a−r)/b
@1434  24  24  24  2
A−143−5  1−5  1−5  1−4  −2
B14−3−5  −1−5  −1−5  −1−4  2
C−14−34  −24  −24  −24  −2

***《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.1147/31と同じであるが,整数割り算においては,14.7÷3.1147÷31は同じではない.
 すなわち,
147=31×4+23に対して,14.7=3.1×4+2.3であるから,商は等しいが余りが異なる.
 下記の表は,被除数,除数とも整数とした場合から,「余りのみ小数に変えた」ものに等しい.
abR

q=a%/%b
余り
r=a%%b
Python

q=a//b
余り
r=a%b
Excel
余り
r=mod(a,b)

q=(a−r)/b
Javascript
余り
r=a%b

q=(a−r)/b
@14.73.14 2.34.0 2.34.0 2.34.0 2.3
A−14.73.1−5 0.8−5.0 0.8−5.0 0.8−4.0 −2.3
B14.7−3.1−5 −0.8−5.0 −0.8−5.0 −0.8−4.0 2.3
C−14.7−3.14 −2.34.0 −2.34.0 −2.34.0 −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になる


《読み物・・・昔の常識,今の非常識》
@小学校の常識
 小学校算数で掛け算,割り算を習う.高学年になると,割り切れない割り算の結果は分数で表せる.そこで
 順序を変えても結果は同じ
A昔のコンピュータの常識
 割り切れない小数は最後の桁で「丸められる」から,元には戻らない

A今のコンピュータの常識
 割ってから掛けても「生き返る」・・・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(文字列型)であるベクトル
【例2】(2+3i, 3−4i)
→ 各要素がcomplex(複素数型)であるベクトル
【例3】(1,2,3)
→ 各要素がnumeric(数値型)であるベクトル
 character(文字列型),complex(複素数型),numeric(数値型),logical(論理型)のデータ型の異なる型が混ざっている場合,Rのベクトルとしては「それらの中の最も緩い型」に揃えた型に整える.
【例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
(2) そのベクトルの要素数を表示するには,
length(ベクトル名)とする.
【例3.4.1.2】
> week1<-c("Sun","Mon","Tue","Wed","Thu")
> length(week1)
[1] 5
(3) Rでは,ベクトルの要素の番号を1番から付ける(他の言語では,CやPythonのように,先頭を0番とすることが多いが,それは各言語ごとの約束事として割り切ればよい.Rでは1からスタートする).
 n番目の要素を表示するには,ベクトル名[n]とする.
【例3.4.1.3】
> v1<-c(5, -6, 7)
> v1[1]
[1] 5
> v1[2] [1] -6
⇒ 勧められる話ではないが,v1[2.5]とすると−6となる・・・項番号が小数で与えられた場合は,ガウス関数(引数を超えない最大の整数)で整数に直した番号と解されるということらしい.
nの要素からなるベクトルv1に対して,(A) v1[1]〜v1[n]は定義済み要素を表示する操作であるのに対して
(B) p>nとなるpの値に対して,v1[p]と入力した場合
(C) p≦0となるpの値に対して,v1[p]と入力した場合
(B)(C)の場合は,定義済み要素を表示するという操作ではない.後の3.2(3)へ
(4) m番目の要素からn番目の要素までを表示するには
ベクトル名[m:n]とする.
【例3.4.1.4】
> month<-c("Jan","Feb","Mar","Apr")
> month[2:3]
[1] "Feb" "Mar"
(5) p番目,q番目,r番目の要素を表示するには
ベクトル名[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番目以外が表示される
 元のベクトルからp番目,q番目,r番目の要素を取り除くには,ベクトル名<−ベクトル名[c(−p, −q, −r)]とする.もしくは,ベクトル名<−ベクトル名[−c(p, q, r)]とする.
【例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.1)より大きい>v1[v1>20]23 34
(7.2)以上>=v1[v1>11]11 23 34
(7.3)より小さい<v1[v1<10]5
(7.4)以下<=v1[v1<=11]5 11
(7.5)等しい==v1[v1==11+12]23
(7.6)等しくない!=v1[v1!=23]5 11 34
(7.7)否定!v1[!v1<10]11 23 34
(7.8)かつ&v1[v1>20&v1<30]23
(7.9)または| v1[v1<=10 | v1>30]5 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要素以外
 そこで,第2段階でv1[−2]<5により,第2要素以外に5が代入される.
【例3.4.2.5】
> v1<-c(3,6,9)
> v1[-2]<-5
> v1
[1] 5 6 5 # 第2要素以外は5になる
 ※ v1[0]およびv1[0]<−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自体も変化する
(2) [2個以上の要素の書き換え]
 ベクトル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
の形でも使うことができる
 数学におけるベクトルの定数倍に対応する場合だけでなく,Rでは数学では使えない形に対しても演算が拡張されている.
【例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
(3) 数学においてベクトルの大きさ(長さ,ノルム)は

で定義される.
 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
...(PC版)メニューに戻る