特定のオブジェクトの型は、class()で確認できます。
> a <- 10 > class(a) [1] "numeric"
ベクトルには、次の6種類あります。
> 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
さまざまな要素を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"
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
> (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
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
要素には、次のようにアクセスできます。
> 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
> 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) <- valueR: 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( 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
表や二次元の配列を表すオブジェクトで、SASやSPSSのデータセットを模倣したものです。これには次の特徴があります。
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