データ型

型の確認

特定のオブジェクトの型は、class()で確認できます。

> a <- 10
> class(a)
[1] "numeric"

vector

ベクトルには、次の6種類あります。

  • Logical … TRUE、FALSE
  • Numeric … 1、1.0など
  • Integer … 1Lなど
  • Complex … 1+2iなど
  • Character … "a"など
  • Raw … charToRaw()の返値など

Raw

> charToRaw("A")
[1] 41

> charToRaw("あ") # Shift_JIS
[1] 82 a0

ベクトルの生成

c(...)
R: Combine Values into a Vector or List
> a <- c(1,2,3)
> print(a)
[1] 1 2 3

> class(a)
[1] "numeric"

要素に文字が含まれるならば、文字のベクトルとなります。

> a <- c(1,"2",3)
> print(a)
[1] "1" "2" "3"

> class(a)
[1] "character"

連続した数値の生成

コロン演算子で、1ずつ加算される連続した数値を生成できます。

> 2:5
[1] 2 3 4 5

> 5:2 # 起点の方が小さい場合には、1ずつ減算
[1] 5 4 3 2

起点を小数とした場合にも、それを基準に加算されます。

> 2.0:5.0
[1] 2 3 4 5

> 1.5:3.5
[1] 1.5 2.5 3.5

終点まで連続しない場合には、その直前の値までが生成されます。

> 1.5:3.6   # 3.6まで生成されない
[1] 1.5 2.5 3.5

> 1.5:4.4   # 4.4でも生成されない
[1] 1.5 2.5 3.5

> 1.5:4.5   # 4.5ならば生成される
[1] 1.5 2.5 3.5 4.5

c()と組み合わせることで、一部を不連続にできます。

> c(1:3, 5, 9:7) # 1~3まで連続し、そこに5が続き、最後は9~7の順となる
[1] 1 2 3 5 9 8 7
増加量の指定

seq()では、コロン演算子ではつねに1の増加量を、任意に指定できます。

seq(...)
R: Sequence Generation
> seq(2, 8, 2) # 2ずつ加算
[1] 2 4 6 8

> seq(2, 4, 0.5) # 0.5ずつ加算
[1] 2.0 2.5 3.0 3.5 4.0

> seq(5, 2, -1) # -1ずつ加算 (1ずつ減算)
[1] 5 4 3 2


> seq(5, 2, 1)
 seq.default(5, 2, 1) でエラー:  'by' 引数中に誤った符号があります

要素へのアクセス

インデックスは1から始まります。

> (a <- c("A","B","C"))
[1] "A" "B" "C"


> print(a[2])  # 数値で指定
[1] "B"

> print(a[0])  # 数値で、0番目を指定
character(0)

> print(a[-1]) # 数値で、負数を用いて指定 → 指定しなかった要素が返される
[1] "B" "C"

> print(a[c(1,3)])   # ベクトルで指定        → 指定の要素がすべて返される
[1] "A" "C"

> print(a[c(1,1,2)]) # ベクトルで重複して指定 → 指定の要素がすべて重複して返される
[1] "A" "A" "B"

> print(a[c(T,F,T)]) # 論理値で指定 → TRUEとした位置の要素が返される
[1] "A" "C"
R: Extract or Replace Parts of an Object

要素数はlength()で確認、変更できます。

length(x)
R: Length of an Object
> a <- 1:3
> length(a)
[1] 3

> length(a) <- 5
> print(a)
[1]  1  2  3 NA NA

> length(a) <- 2
> print(a)
[1] 1 2

ベクトルの拡張

存在しない要素へ代入すると、その要素の位置まで拡張されます。

> (a <- 1:3)
[1] 1 2 3

> a[6] <- 10
> print(a)
[1]  1  2  3 NA NA 10

ベクトルにベクトルを追加するには、c()を用います。

> (a <- 1:3)
[1] 1 2 3

> c(a, 5:7)
[1] 1 2 3 5 6 7

行列への拡張

行列へ拡張するならば、cbind()またはrbind()を用います。

> (a <- 1:3)
[1] 1 2 3

> cbind(a, 9)
     a
[1,] 1 9
[2,] 2 9
[3,] 3 9

> rbind(a, 4:6)
  [,1] [,2] [,3]
a    1    2    3
     4    5    6

このとき列名や行名を既定値から変更するには、引数のdeparse.levelを指定します。

> cbind(a, 9, deparse.level=0)
     [,1] [,2]
[1,]    1    9
[2,]    2    9
[3,]    3    9

> cbind(a, 9, deparse.level=1)
     a
[1,] 1 9
[2,] 2 9
[3,] 3 9

> cbind(a, 9, deparse.level=2)
     a 9
[1,] 1 9
[2,] 2 9
[3,] 3 9

ベクトル演算

算術演算子を用いて、ベクトル同士で演算できます。

> a <- c(1,2,3)
> b <- c(2,2,2)


> print(a+b)
[1] 3 4 5

> print(a-b)
[1] -1  0  1

> print(a*b)
[1] 2 4 6

> print(a/b)
[1] 0.5 1.0 1.5

要素数が異なるベクトルで演算すると、不足する側の要素がくり返し表れると見なされて処理されます。

> a <- c(1,2,3,4)
> b <- c(1,2) # aとの演算時には、(1,2,1,2)と見なされる

> print(a*b)
[1] 1 4 3 8

要素の並べ替え

sort(
    x,
    decreasing = FALSE, ...)
R: Sorting or Ordering Vectors
> sort(c(3,1,4,2))
[1] 1 2 3 4

> sort(c("b","A","B","a"))
[1] "a" "A" "b" "B"

> sort(c(T,1,"A",2))
[1] "1"    "2"    "A"    "TRUE"


> sort(c(3,1,4,2), decreasing=T)
[1] 4 3 2 1

これをorder()で処理するならば、次のようにします。

> a <- c(3,1,4,2)
> o <- order(a)

> print(o) # 並べ替えの順序。最初にaの2番目の要素、次に4番目の要素…
[1] 2 4 1 3

> print(a[o]) # 要素を指定順で取得
[1] 1 2 3 4

list

さまざまな要素を1次元に格納できるオブジェクトです。格納できる要素は数値、文字列、ベクトル、他のリスト、それに行列や関数です。

list(...)
R: Lists - Generic and Dotted Pairs
> a <- list(1,"a",T)
> print(a)
[[1]]
[1] 1

[[2]]
[1] "a"

[[3]]
[1] TRUE

要素へのアクセス

要素には、1から始まる添字を付けてアクセスできます。

> print(a[2])
[[1]]
[1] "a"

要素に名前が付けられているならば、その名前でもアクセスできます。R: Extract or Replace Parts of an Object

> a <- list(x=1,2,z=3)
> print(a)
$x
[1] 1

[[2]]
[1] 2

$z
[1] 3


> print(a[3])
$z
[1] 3

> print(a$z) # 名前によるアクセス。これは3番目の要素であるから、a[3]とも同じ
[1] 3

要素数はlength()で確認できます。

> length(a)
[1] 3

要素の追加

指定の添字までの間に要素が定義されていない場合には、NULLで埋められます。

> (a <- list(5))
[[1]]
[1] 5


> a[3] <- 10 # 添字で指定
> print(a)
[[1]]
[1] 5

[[2]]
NULL

[[3]]
[1] 10


> a$x <- "A" # 名前で指定
> print(a)
[[1]]
[1] 5

[[2]]
NULL

[[3]]
[1] 10

$x
[1] "A"

matrix

2次元に要素を配置し、行列を表すオブジェクトです。

matrix(
    data = NA,
    nrow = 1,
    ncol = 1,
    byrow = FALSE,
    dimnames = NULL)
R: Matrices
> matrix(1:3)
     [,1]
[1,]    1
[2,]    2
[3,]    3
> matrix(1:6, 3) # 3行
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
> matrix(1:6, 2) # 2行
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

byrowをTRUEとすると、入力ベクトルの並びが行方向になります。

> matrix(1:6, 2, byrow=T)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6

要素へのアクセス

要素には、次のようにアクセスできます。

> a <- matrix(1:6, 3)
> print(a)
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

> print(a[3,2]) # 3行2列目の要素
[1] 6

> print(a[,2])  # 2列目の要素
[1] 4 5 6


> print(a[3])      # 先頭から3番目の要素
[1] 3

> print(a[3:6])    # 先頭から3~6番目の要素
[1] 3 4 5 6

> print(a[c(2,4)]) # 先頭から2番目と4番目の要素
[1] 2 4

行や列に名前が付けられた行列には、次のようにアクセスできます。

> name <- list(c("r1","r2"),c("c1","c2","c3"))
> (a <- matrix(c(1:3, 11:13), 2, byrow=T ,dimnames=name))
   c1 c2 c3
r1  1  2  3
r2 11 12 13

> print(a["r2","c1"]) # "r2"行、"c1"列の要素
[1] 11

> print(a["r2",])     # "r2"行の要素
c1 c2 c3
11 12 13

行列の大きさは、nrow()やncol()で確認できます。

> nrow(a)
[1] 3

> ncol(a)
[1] 2

> dim(a)
[1] 3 2

> length(a)
[1] 6

行列の拡張

cbind(..., deparse.level = 1)
rbind(..., deparse.level = 1)
R: Combine R Objects by Rows or Columns
  • cbind … 列 (Column) に結合
  • rbind … 行 (Row) に結合
> (a <- matrix(1:4, 2))
     [,1] [,2]
[1,]    1    3
[2,]    2    4


> cbind(a, 9) # 列 (Column) を追加
     [,1] [,2] [,3]
[1,]    1    3    9
[2,]    2    4    9

> rbind(a, 5:6) # 行 (Row) を追加
     [,1] [,2]
[1,]    1    3
[2,]    2    4
[3,]    5    6

array

2次元以上のデータを格納できるオブジェクトです。

array(
    data = NA,
    dim = length(data),
    dimnames = NULL)
R: Multi-way Arrays

dimを指定しない、もしくは1次元ベクトルを指定した場合は、1次元の配列となります。

> array(2:4)
[1] 2 3 4
> array(2:4,5)
[1] 2 3 4 2 3

2次元ベクトルを指定した場合は、2次元となります。

> array(2:7,c(3,2))
     [,1] [,2]
[1,]    2    5
[2,]    3    6
[3,]    4    7
> array(2:7,c(2,3))
     [,1] [,2] [,3]
[1,]    2    4    6
[2,]    3    5    7

3次元では、3次元の配列となります。

> array(2:9,c(1,2,3))
, , 1

     [,1] [,2]
[1,]    2    3

, , 2

     [,1] [,2]
[1,]    4    5

, , 3

     [,1] [,2]
[1,]    6    7

要素へのアクセス

要素には、次のようにアクセスできます。

2次元

> a <- array(2:7,c(2,3))
> print(a)
     [,1] [,2] [,3]
[1,]    2    4    6
[2,]    3    5    7
> print(a[1]) # 1番目
[1] 2

> print(a[2]) # 2番目
[1] 3

> print(a[2,]) # 2行目
[1] 3 5 7

> print(a[,2]) # 2列目
[1] 4 5

> print(a[2,3]) # 2行 3列目
[1] 7

3次元

> a <- array(1:9,c(2,2,2))
> print(a)
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8
> print(a[1,2,1]) # x=1, y=2, z=1 ?
[1] 3

> print(a[1,2,2]) # x=1, y=2, z=2 ?
[1] 7


> print(a[1,2,])
[1] 3 7

> print(a[,2,1])
[1] 3 4


> print(a[1,,])
     [,1] [,2]
[1,]    1    5
[2,]    3    7

> print(a[,1,])
     [,1] [,2]
[1,]    1    5
[2,]    2    6


> print(a[,,])
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

配列の大きさ

> a <- array(1,c(2,3))
> nrow(a)
[1] 2
> ncol(a)
[1] 3
> dim(a)
[1] 2 3
> length(a)
[1] 6
> a <- array(1,c(2,3,4))
> nrow(a)
[1] 2
> ncol(a)
[1] 3
> dim(a)
[1] 2 3 4
> length(a)
[1] 24

次元の変更

dim()により次元や配置を変更できます。

dim(x) <- value
R: Dimensions of an Object
> (x <- 1:6)
[1] 1 2 3 4 5 6

> dim(x) <- c(2,3) # 2次元への変更
> print(x)
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

> dim(x) <- c(3,2) # 構成の変更
> print(x)
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

> dim(x) <- c(1,2,3) # 3次元への変更
> print(x)
, , 1

     [,1] [,2]
[1,]    1    2

, , 2

     [,1] [,2]
[1,]    3    4

, , 3

     [,1] [,2]
[1,]    5    6

> dim(x) <- c(1,2,4) # 要素数を越えた構成への変更
 dim(x) <- c(1, 2, 4) でエラー:
   dims [product 8] はオブジェクト [6] の長さに整合しません

次元による型の違い

2次元ではmatrixとなります。

> a <- array(1,c(1)) # 1次元
> class(a)
[1] "array"

> a <- array(1,c(1,1)) # 2次元
> class(a)
[1] "matrix"

> a <- array(1,c(1,1,1)) # 3次元
> class(a)
[1] "array"
> a <- array(1,c(2,2,2))
> class(a)
[1] "array"

> class(a[1,1,1])
[1] "numeric"

> class(a[1,1,])
[1] "numeric"


> class(a[1,,])
[1] "matrix"

> class(a[,1,])
[1] "matrix"


> class(a[,,])
[1] "array"

factor

有限個の項目を持つ、同列に分類されたオブジェクトです。これには文字列と数値を格納できます。

factor(
    x = character(),
    levels,
    labels = levels,
    exclude = NA,
    ordered = is.ordered(x),
    nmax = NA)
R: Factors

要素へのアクセス

> a <- factor(c("B","D","A"))

> print(a)
[1] B D A
Levels: A B D

> print(a[1])
[1] B
Levels: A B D

> print(a[2])
[1] D
Levels: A B D

data.frame

表や二次元の配列を表すオブジェクトで、SASやSPSSのデータセットを模倣したものです。これには次の特徴があります。

  • 列名は、非空文字
  • 行名は、一意
  • データフレーム内のデータは、数値、因子 (factor) または文字
  • すべての列は、同数の項目を含む
data.frame(
    ...,
    row.names = NULL,
    check.rows = FALSE,
    check.names = TRUE,
    fix.empty.names = TRUE,
    stringsAsFactors = default.stringsAsFactors())
R: Data Frames
> data.frame(x=1, y=1:3)
  x y
1 1 1
2 1 2
3 1 3

要素へのアクセス

> a <- data.frame(x="a", y=1:3)
> print(a)
  x y
1 a 1
2 a 2
3 a 3

> print(a[2,1]) # 2行1列目の要素
[1] a
Levels: a

> print(a[2,2]) # 2行2列目の要素
[1] 2


> print(a$x)   # x列
[1] a a a
Levels: a

> print(a$y)   # y列
[1] 1 2 3

> print(a[,2]) # 2列目
[1] 1 2 3


> print(a[c(1,3),]) # 1行目と3行目
  x y
1 a 1
3 a 3

文字列は、既定ではfactorとなります。

> class(a[2,1])
[1] "factor"

> class(a[2,2])
[1] "integer"

これをcharacterとするには、データフレーム生成時にstringsAsFactorsにFALSEを指定します。

> a <- data.frame(x="a", y=1:3, stringsAsFactors=F)

> class(a[2,1])
[1] "character"

データフレームの大きさ

> (a <- data.frame(x="a", y=1:3))
  x y
1 a 1
2 a 2
3 a 3

> nrow(a) # 行数
[1] 3
> ncol(a) # 列数
[1] 2
> dim(a)
[1] 3 2

> length(a)
[1] 2

データフレームの拡張

列の追加

新しい列名で、既存のデータフレームの行と同数のデータを追加するだけです。

> (a <- data.frame(x=1, y=1:3))
  x y
1 1 1
2 1 2
3 1 3

> a$z <- 5:7
> print(a)
  x y z
1 1 1 5
2 1 2 6
3 1 3 7

行の追加

データフレームへ行は追加できないため、同じ構成のデータフレームを作成し、それをrbind()で結びつけます。

> (a <- data.frame(x=1, y=1:3))
  x y
1 1 1
2 1 2
3 1 3

> (b <- data.frame(x=5, y=10))
  x  y
1 5 10

> c <- rbind(a, b)
> print(c)
  x  y
1 1  1
2 1  2
3 1  3
4 5 10

要素の並べ替え

order(
    ...,
    na.last = TRUE,
    decreasing = FALSE,
    method = c("shell","radix"))
R: Ordering Permutation

order()で指定の列の順序を取得し、それで行の並びを指定して並べ替えられた結果を取得します。

> (a <- data.frame(x=3:1, y=c(2,1,3)))
  x y
1 3 2
2 2 1
3 1 3

> (o <- order(a$x)) # x列の順序を取得
[1] 3 2 1

> a[o,]
  x y
3 1 3
2 2 1
1 3 2

> a[order(a$y),] # y列の順序を取得し、並べ替え
  x y
2 2 1
1 3 2
3 1 3