R の基本操作

代入演算子 (assignment operator) とベクトル (vector) とは

  • 代入は =<- (ALT+-) です。伝統的に使われる代入は <- ですが、私は = を使っています。
  • 左辺は変数名、右辺は値です。
# 二種類の代入と c() 関数
a = 4.2
b <- 5.0
c(a, b)
[1] 4.2 5.0
  • c() は渡された引数を結合します。
  • # の後から続く文字列はコードとして実行されません。実行されない文書はコメントと呼びます。
(a + b) * c(a, b)
[1] 38.64 46.00
  • R はベクトル処理という実行機構が特徴的です。
  • 上のコードは (a + b) \times a(a + b) \times b を求めています。

RStudio の場合 <-ALT + - のショートカットを定義しています。

R の主なデータタイプとデータ構造

  • 整数 integer

  • 実数 double, numeric

  • 複素数 complex number

  • 時系列 time-series (POSIX)

  • 文字列 character

  • 論理値 logical

  • 因子 factor

  • ベクトル vector

  • 配列 array, matrix

  • リスト list

  • テーブル(データフレーム) dataframe

データの作り方

ベクトル

a = c(10.3, 20.2, 30.1)
b = c("rabbit", "cat", "mouse", "dog")
d = c(TRUE, FALSE, T)
e = factor(c("nagasaki", "kagoshima", "fukuoka"))

リスト

ベクトルの長さは異なってもいい。 ここでは、リストの要素名を指定しました。

z1 = list("A" = a, "B"= b, "D" = d, "E" = e)

データフレーム

ベクトルの長さを揃える必要がある。 ここではb[1:3]bに渡すことで、変数名を指定しました。

z2 = data.frame(a, b = b[1:3], d, e)

リストの構造を確認しよう

Rオブジェクトの構造 (structure) は str() で確認します。

str(z1)
List of 4
 $ A: num [1:3] 10.3 20.2 30.1
 $ B: chr [1:4] "rabbit" "cat" "mouse" "dog"
 $ D: logi [1:3] TRUE FALSE TRUE
 $ E: Factor w/ 3 levels "fukuoka","kagoshima",..: 3 2 1

リストからデータを抽出する

リストの要素は次のように抽出できます。

z1$A
[1] 10.3 20.2 30.1

リストからの抽出方法は $ 以外に, [[[ でもできます。

z1[c("A", "D")]
z1[c(1,4)]
z1[[2]]
z1[[c(2,3)]]
z1[[2]][c(1,2)]

データフレームの構造を確認しよう

str(z2)
'data.frame':   3 obs. of  4 variables:
 $ a: num  10.3 20.2 30.1
 $ b: chr  "rabbit" "cat" "mouse"
 $ d: logi  TRUE FALSE TRUE
 $ e: Factor w/ 3 levels "fukuoka","kagoshima",..: 3 2 1

リストと似ていますが、そもそもデータフレームはリストです。 つまり、リストと同じように操作できます。

z2$a
[1] 10.3 20.2 30.1
z2[c("a", "d")]
z2[c(1, 4)]
z2[[2]]
z2[[c(2,3)]]
z2[[2]][c(1,2)]

比較演算

  • 比較に使う論理演算子:&(論理積 AND), | (論理和 OR), !(否定 NOT)
A = c(5, 3, 2)
B = c(5, 2, 1)

# 論理積
(A[1] > B[1]) & (A[1] == B[1])
[1] FALSE
# 論理和
(A[1] > B[1]) | (A[1] == B[1])
[1] TRUE
# 否定と論理積
!(A[1] > B[1]) & (A[1] == B[1])
[1] TRUE
# 否定と論理和
(A[1] < B[2]) | !(A[1] == B[1])
[1] FALSE

比較演算を使ったデータの抽出

a = c(10.3, 20.2, 30.1)
b = c("rabbit", "cat", "mouse")
d = c(TRUE, FALSE, T)
e = factor(c("nagasaki", 
             "kagoshima", 
             "fukuoka"))
Z = data.frame(a, b, d, e)
Z[Z$a > 20, ]
     a     b     d         e
2 20.2   cat FALSE kagoshima
3 30.1 mouse  TRUE   fukuoka
Z[Z$a > 10 & Z$a < 20.2, ]
     a      b    d        e
1 10.3 rabbit TRUE nagasaki
Z[Z$a > 10 & Z$a <= 20.2, ]
     a      b     d         e
1 10.3 rabbit  TRUE  nagasaki
2 20.2    cat FALSE kagoshima
Z[identical(Z$a, 20) | !Z$d, ]
     a   b     d         e
2 20.2 cat FALSE kagoshima

重要! 数値の比較について

パソコンは 2 進数で計算しているので、数値は正確ではない!

たとえば:

0.2 * 0.2 / 0.2 == 0.2 # = と =
[1] FALSE

数値の比較をする場合は all.equal() を使いましょう。

# 上のコードと同じ
all.equal(0.2 * 0.2 / 0.2, 0.2, tolerance = 0)
[1] "Mean relative difference: 1.387779e-16"
# 機械誤差を考慮した比較
all.equal(0.2 * 0.2 / 0.2, 0.2, tolerance = .Machine$double.eps)
[1] TRUE
  • ちなみに比較用記号は <, >, >= (>=), <= (<=), != (!=), == (==) です。