Chapter 4 Rを使ってみる

4.1 計算機としてのR

4.1.1 演習:R Scriptの作成

  • r_renshuプロジェクトを開く。
  • 新たにr_trial.Rという名前のRスクリプトを作成しよう。
    • スクリプトの作り方を忘れた人はセクション3.12を参照。
  • 以下の演算をそのスクリプトに書いて実行してみよう。

4.1.2 足し算・引き算

1 + 1
## [1] 2
400 - 50
## [1] 350

4.1.3 かけ算・割り算

掛け算はアスタリスク(*)を使う。

2 * 3
## [1] 6

割り算はスラッシュ(/)を使う

(2+7)/3
## [1] 3

割り切れない場合はある程度まで桁が表示

10/3
## [1] 3.333333

4.1.4 練習問題:以下の演算をRを使ってやってみよう

  1. \(9179\div67\)
  2. \((256\times 43 + 54)\div 8\)
  3. \(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12\)

4.1.5 論理演算

論理演算は書いてあることが真か偽か?を評価する。

# 「10は5より大きい」という命題は正しい?
10 > 5
## [1] TRUE
# 「3は5より大きい」という命題は正しい?
3 > 5
## [1] FALSE
# 「等しい」は=が2つ。1つだと「代入」という意味になってしまう。
"musashi" == "musashi"
## [1] TRUE
"musashi" == "634"
## [1] FALSE
# musashiと634は等しくない、という命題
"musashi" != "634"
## [1] TRUE

OR 演算

# 2つの論理演算のいずれかがTRUEならTRUE

(5 == 5) | (3 == 3)
## [1] TRUE
(5 == 5) | ("musashi" == "634")
## [1] TRUE

AND 演算

# 複数の論理演算の全てがTRUEならTRUE

(5 == 5) & (3 == 3)
## [1] TRUE
(5 == 5) & ("musashi" == "634")
## [1] FALSE

4.2 プログラミング言語としてのR

4.2.1 変数へのオブジェクトの代入

x や yという「入れ物」に数字を代入する。

x <- 8  # 代入は <-
y = 3   # 代入は = でもよい

z <- x + y
z
## [1] 11

オブジェクトは「上書き」できることに注意。 以下の例では、xに3を代入した後x+1という演算をまた、xに代入している。 それによって、xは4となる。

x <- 3
x <- x + 1
x
## [1] 4

4.2.2 プログラミング:繰り返し

同じような作業を繰り返させる。 以下のケースでは、\(i\)というオブジェクトに1から10までを順番に入れて、それぞれのターンにおいて\(i+1\)という数字をprint()という関数でコンソールに表示させている。つまり、同じ作業を10回中身を変えてやりたいときに、print(1+1), print(2+1)...というように、何度も同じ文を書く必要がない。

for(i in 1:10){
  print(i+1)
}
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
## [1] 11

4.2.3 練習問題:ループを用いた計算

1から50までを合計する繰り返し文を書いてみよう。

\(1+2+3+\cdots+50=\)

ヒント:goukeiというオブジェクトを用意して、ループの前に0を代入してみよう。

4.2.4 プログラミング:if文

もしある命題が真ならどうする、偽ならどうするというifの条件によって異なる処理を行うif文もプログラミングの基本だ。Rでも簡単に実装できる。

x <- 5

# もしxが0より大きいなら、yに3+xを代入するという処理を実行する。
if(x > 0){
  y = 3 + x
}

print(y)
## [1] 8
x <- -4

# もしxが0より大きいなら、wに3+xを代入するという処理を実行する。
if(x > 0){
  w = 3 + x
}

# 上の処理は実行されていないのでwは定義されず、"not found"というエラーが出る。
print(w)
## Error in eval(expr, envir, enclos): object 'w' not found

もし命題が偽だった場合の処理も指定できる。

x <- -5

# もしxが0より大きければ3を足してvに代入、
# そうでなければ3を引いてvに代入。
if(x > 0){
  v = x + 3
}else{
  v = x - 3
}

print(v)
## [1] -8

4.3 データ型

Rのオブジェクトにはいくつかの「型」がある。そのオブジェクトに格納されている要素がどういう性質を持つか?が定義される。これを、データ型と呼ぶ。 たとえば、数字なのか文字列なのか?で扱いが異なる。

# 実数
x <- 634
mode(x)
## [1] "numeric"
# 文字列
y <- "musashi"
mode(y)
## [1] "character"

4.3.1 データ型:注意点

我々の目には同じ634であっても、データ型が文字列として定義されていると、コンピューターは計算ができない。ただ6.3.4.と書かれている文字であって、数字ではないという認識がなされるからである。

# 数字だが文字列
z <- "634"
mode(z)
## [1] "character"
z + 6
## Error in z + 6: non-numeric argument to binary operator

4.3.2 データ型の変換

# データ型のチェック
mode(z)
## [1] "character"
# 実数かどうか?
is.numeric(z)
## [1] FALSE
# データ型を実数に変換して再度zに代入
z <- as.numeric(z)
# 再度チェック
is.numeric(z)
## [1] TRUE

4.4 ベクトル

順序のある要素の集まりをベクトルと呼ぶ。 c()関数で作成することができる。

v1 <- c(1,2,3,4,5)
print(v1)
## [1] 1 2 3 4 5

ベクトルは、文字や論理値など取ることができる。

v2 <- c("musashi","nerima","ekoda")
print(v2)
## [1] "musashi" "nerima"  "ekoda"
v3 <- c(FALSE,TRUE,TRUE,FALSE)
print(v3)
## [1] FALSE  TRUE  TRUE FALSE

4.4.1 ベクトルの型

異なるデータ型を同じベクトルに混ぜることはできない。 混ぜると、一定のルールに基づいてある型が他の型より優先される

# 数値と論理値を混ぜると、数値になる。(FALSE->0, TRUE->1)
v4 <- c(FALSE,1,TRUE)
print(v4) 
## [1] 0 1 1
# 数値と論理値と文字列を混ぜると、全部文字列になる

v5 <- c(FALSE,1,"musashi")
print(v5)
## [1] "FALSE"   "1"       "musashi"

4.4.2 ベクトル:連続した数値

連続した数値を入力したい場合はコロン:を使う

v6 <- c(1:10)
print(v6)
##  [1]  1  2  3  4  5  6  7  8  9 10

nずつ増える数列を作りたい場合は、seq()関数を使う

# 例:2から50まで2ずつ増える数列
v7 <- seq(2,50,by=2)

4.4.3 練習問題: 数列の作成

3から60まで3ずつ増える数列ベクトルを作りなさい

4.4.4 ベクトル:同じ数値が並ぶベクトル

同じ数値がたくさんあるベクトルを作りたい場合はrep()関数を使う

# 5が100個ならぶベクトル
v8 <- rep(5,100)
print(v8)
##   [1] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
##  [41] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
##  [81] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5

本当に100個出てるか? ベクトルの要素の数を数える関数はlength

length(v8)
## [1] 100

4.4.5 練習問題:ベクトルの作成

seq()関数とrep()関数を使って、2,4,6,8,10が5回連続するベクトルをつくってみよう。 結果をv9_exというオブジェクトに格納して、コンソールに結果を表示しよう。

4.4.6 ベクトル要素の参照

ベクトルのn個目の要素を参照したいときは角カッコを使う[]

# v7の3つ目の要素は6
v7[3]
## [1] 6
# v7の2,3,5つ目の要素
v7[c(2,3,5)]
## [1]  4  6 10

4.5 リスト

様々なベクトルやデータなどのオブジェクトをひとまとめにして扱うことができるのがリスト

リストはlist()関数で作成する

# aというオブジェクトに、文字列ベクトル、数値ベクトル、データが混ざって入っている。
# カンマ, の後に改行しているが、listのかっこが閉じるまではひとまとまりだと扱われる。

a <- list(
  c("a", "b", NA, "d"),
  num = c(3, 1.1, 5),
  data = head(mtcars, 1))

a
## [[1]]
## [1] "a" "b" NA  "d"
## 
## $num
## [1] 3.0 1.1 5.0
## 
## $data
##           mpg cyl disp  hp drat   wt  qsec vs am gear carb
## Mazda RX4  21   6  160 110  3.9 2.62 16.46  0  1    4    4

4.5.1 リストの参照

リストの参照も角カッコでできる

# リストの参照
a[1]
## [[1]]
## [1] "a" "b" NA  "d"
a[2]
## $num
## [1] 3.0 1.1 5.0

4.5.2 リストの参照

リストの中身のみを取り出したい場合は、二重括角カッコを使う[[]]

a[[3]]
##           mpg cyl disp  hp drat   wt  qsec vs am gear carb
## Mazda RX4  21   6  160 110  3.9 2.62 16.46  0  1    4    4