こんにちは。産婦人科医のtommyです。(Twitter:@obgyntommy)
本記事では基本的なRのオブジェクトについて解説します。
対象としては全くRに触れたことのない方やRの学習初心者の方向けになります。
非常に簡単な四則演算の内容になりますが、RStudioを用意して実際に手を動かしてみてください。
RStudioを手軽にセットアップするにはRStudio Cloudが便利です。詳しい内容は以下を参照してください。
R Studio Cloudの使い方
続きを見る
R Studio Cloud で学習される方はこちらを参照してください。
また、RStudio Cloudではなくても、Rのインストール方法やRStudioの使い方については以下の記事を参照してください。
Rのインストールの方法とRStudioの使い方
続きを見る
では早速みていきましょう。
基本的なデータタイプ5つ
今回はRのオブジェクトの種類とその簡単な操作方法について学んでいきましょう。
データ構造はRを使う上で非常に重要な概念です。
オブジェクトの操作方法をきちんと学んでいないと、Rでプログラミングをする際に大変多くのエラーに悩まされることになり、エラーを素早く解決することも困難になる事も多くなるかと思います。
Rで作ったり操作したりするものはすべてオブジェクトです。
オブジェクト=モノという理解で良いですが、「何らかの変数や関数などを持つ、名前がついた入れ物」とイメージするとわかりやすいです。
Rには5つの基本的なデータタイプがあります。
Rの5つの基本的なデータタイプ
- character(文字列)
- numeric(実数と少数)
- integre(整数)
- logical
- complex(複素数)
では順番に確認していきましょう。
character(文字列)
文字列は" "もしくは' 'とダブル(シングル)クオテーションマークで挟むことでつくることができます。
1 2 3 4 5 | a <- 'America' print(a) ## [1] "America" |
character型はアルファベットの他、数字、シンボル、スペースなども含むことができます。
1 2 3 4 5 | a1 <- "America's 2020 predidential election!! 日本語もOK" print(a1) ## [1] "America's 2020 predidential election!! 日本語もOK" |
Rでオブジェクトを作った際には、その中身をいろんな方法で調べることができます。
class()
を使うと、どんな種類のオブジェクトなのかを調べることができます。
1 2 3 | class(a) ## [1] "character" |
typeof()
も同じですが、class()
よりもさらに詳しいデータタイプを表示してくれます。
1 2 3 | typeof(a) ## [1] "character" |
length()
はそのオブジェクトの長さを返してくれます。
1 2 3 | length(a) ## [1] 1 |
nchar()
は文字列の長さを返します。
1 2 3 | nchar(a) ## [1] 7 |
attributes()
はそのオブジェクトにメタデータが付随していないかを調べてくれます。
1 2 3 | attributes(a) ## NULL |
numeric(実数と小数)
Rで数値を直接打ち込むと基本的にdouble型として認識されます。
1 2 3 4 5 6 7 8 9 | b <- 1.9 class(b) ## [1] "numeric" typeof(b) ## [1] "double" |
たとえ打ち込んだのが整数だとしても、認識はdouble型となります。
1 2 3 4 5 6 7 8 9 | c <- 2 class(c) ## [1] "numeric" typeof(c) ## [1] "double" |
is.integer()
を使うと、中身が整数かどうか判定をしてくれます。double型と認識されるので答えはFALSE
になります。
1 2 3 | is.integer(c) ## [1] FALSE |
integer(整数)
整数の型をつくるには、数値を明示的に整数だと指定する必要があります。
ここではデータタイプを整数型に変換するas.integer()を使って数値を整数として設定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | d <- as.integer(c) print(d) ## [1] 2 class(d) ## [1] "integer" typeof(d) ## [1] "integer" is.integer(d) ## [1] TRUE |
logical
TRUE(真)、FALSE(偽)の2つの値を取る論理型で、TRUE、FALSEはそれぞれ T
、F
と略して書くこともできます。
以下では、「dは整数か?」という問いそのものを e
という変数に収納しました。
1 2 3 4 5 | e <- is.integer(d) print(e) ## [1] TRUE |
このeという変数がlogicalというデータタイプになります。
1 2 3 4 5 6 7 8 9 10 11 | class(e) ## [1] "logical" typeof(e) ## [1] "logical" is.logical(e) ## [1] TRUE |
complex(複素数)
Rでは複素数型というデータタイプがあります。これは実数と虚数iの組み合わせで作られる変数です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | f <- 2 + 3i print(f) ## [1] 2+3i class(f) ## [1] "complex" typeof(f) ## [1] "complex" is.complex(f) ## [1] TRUE |
基本的なデータ構造5-2
さて、5つの基本的なデータタイプを学んだところで、次にデータ構造について学びます。
データ構造とは、様々なデータタイプのオブジェクトが組み合わさってできたものを指します。
異なるデータタイプのオブジェクトを組み合わせることで、Rでは大きく分けて5つのデータ構造をつくることができます。
Atomic vector(ベクトル)
ベクトルはRにおける最も基本的で頻出のデータ構造です。「いくつかの値が並列された入れ物」というイメージです。
英語ではatomic vectorとよく呼びます。
atomicというのは、ベクトルを構成する成分のデータタイプがすべて同じだということを指しています。
Rにおいてベクトルは異なるデータタイプの成分を保有することができません。
つまりatomicと明示されていなくても、Rにおけるベクトルとはすべてatomic vectorのことを指しています。
後ほど説明しますが、いくつかの異なるデータタイプを持つ入れ物はlistというデータ構造を取ります。
ベクトルを構成する成分は character
, logical
, integer
または numeric
の場合がほとんどです。
ベクトルの作り方
空っぽのベクトルをつくるにはvector()を使います。何も入っていないベクトルのデータタイプはlogicalとなります
1 2 3 4 5 | g <- vector() class(g) ## [1] "logical" |
同じvector()関数を使って、データタイプの種類とベクトルの長さを指定することができます。
1 2 3 4 5 6 7 8 9 | h <- vector("character", length = 3) print(h) ## [1] "" "" "" class(h) ## [1] "character" |
ベクトルの成分そのものを指定してつくる場合は、c() を使います。c は combine の c です。
1 2 3 4 5 6 7 8 9 | i <- c(8, 2, 5, 4) print(i) ## [1] 8 2 5 4 class(i) ## [1] "numeric" |
ベクトルの中身を調べる(attributesの使い方)
ベクトルの中身を調べるときに便利なattributesをいくつか紹介します。 length()はベクトルの成分の長さを調べるときに使えます。
1 2 3 | length(i) ## [1] 4 |
ベクトルの構造を手短に調べる場合はstr()関数も便利です。
1 2 3 | str(i) ## num [1:4] 8 2 5 4 |
これで、ベクトルiを構成する成分がnumeric型で、長さが4、成分はそれぞれ8, 2, 5, 4であるとわかります。
要素を加える
既存のベクトルに新しく要素を加えるには、c()
を使います。以下では、以前作ったベクトル i
に新しく20という値を加えて、それを新しいベクトル j
にしまっています。
1 2 3 4 5 | j <- c(i, 20) print(j) ## [1] 8 2 5 4 20 |
以前作った空の文字列ベクトルhに新しい文字列 "Japan"
を入れて上書きする場合は、
1 2 3 4 5 | h <- c("Japan", h) print(h) ## [1] "Japan" "" "" "" |
数列からベクトルをつくる
数列からベクトルをつくることができます。:を使うと、始まりの数字と終わりの数字を指定して整数型のベクトルを作ることができます。
1 2 3 4 5 6 7 8 9 | series <- 1:10 print(series) ## [1] 1 2 3 4 5 6 7 8 9 10 class(series) ## [1] "integer" |
seq()を使うと、整数に限らずより細かな指定ができます。
1 2 3 4 5 6 7 8 9 | seq(from = 5.5, to = 10, by = 0.1) ## [1] 5.5 5.6 5.7 5.8 5.9 6.0 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 ## [16] 7.0 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8.0 8.1 8.2 8.3 8.4 ## [31] 8.5 8.6 8.7 8.8 8.9 9.0 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 ## [46] 10.0 |
ベクトルの中の欠損値
ベクトル内に欠損値がある場合や入れたい場合はNAとして表現されます。NAはどんなデータタイプのベクトルでも含むことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | c(0.2, NA, 0.4) ## [1] 0.2 NA 0.4 c(T, F, NA) ## [1] TRUE FALSE NA c("a", "b", NA, "d", "e") ## [1] "a" "b" NA "d" "e" c(1-2i, 4+7i, NA) ## [1] 1-2i 4+7i NA |
is.na()
関数はベクトルの各成分についてそれがNAかどうかを調べ、TRUEかFALSEで返してくれます。
anyNA()
関数 は一つでもNAがあればTRUEを返し、全てNAの場合だけFALSEを返します。
1 2 3 4 5 6 7 8 9 | j <- c("a", "b", NA, "d", "e") is.na(j) ## [1] FALSE FALSE TRUE FALSE FALSE anyNA(j) ## [1] TRUE |
異なるデータタイプを1つのベクトルの中に混ぜると?
さて、Rではベクトルはすべてatomic vectorだと学びました。
では異なるデータタイプを持つベクトルを無理やりつくるとどうなるのか実験してみましょう。
以下では、numeric, character, logicalの3種類のデータタイプを持つベクトルを無理やりつくっています。
1 2 3 | print(c(1, "Japan", TRUE)) ## [1] "1" "Japan" "TRUE" |
ベクトルは出力できましたが、すべて文字列に置き換えられてしまっているのがわかります。
つまりデータタイプが統一されていない場合は、どれか一つのタイプに無理やり変換されてしまうのです。
numericとlogicalだけではどうなるでしょうか?
1 2 3 | print(c(1, TRUE)) ## [1] 1 1 |
logical型のTRUEがnumeric型の1 に置き換えられてしまいました。
このような形でベクトルをつくる時は、データタイプが変換されてしまうことをアタマに入れておいてください。
matrix(マトリックス)
Rでのマトリックスは「atomic vectorを縦や横に何本か並べたもの」というイメージです。
元がatomic vectorなので、matrixを構成する成分のデータタイプはすべて同じものになります。
マトリックスの基本的な作り方
マトリックスを作る最も簡単な方法は matrix()
関数
を使うことです。matrix()
関数
の中では行数と列数を指定します。
以下では2行×3列のマトリックスを作っています。
1 2 3 4 5 6 7 8 9 | m <- matrix(nrow = 2, ncol = 3) m ## [,1] [,2] [,3] ## [1,] NA NA NA ## [2,] NA NA NA |
matrixをつくることで dimension(次元) という新しい概念が生まれます。
dimensionは dim()
で表示することができ、行の数と列の数で表されます。
1 2 3 4 5 6 7 8 9 10 11 | dim(m) ## [1] 2 3 class(m) ## [1] "matrix" typeof(m) ## [1] "logical" |
ベクトルからマトリックスをつくる
matrix()関数を使えば、ベクトルからマトリックスをつくれます。マトリックスはたった一本のベクトルからでも作ることができます。
以下は1, 2, 3, 4, 5, 6という一本のベクトルから6行✕1列のマトリックスを作っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | m <- matrix(c(1:6)) m ## [,1] ## [1,] 1 ## [2,] 2 ## [3,] 3 ## [4,] 4 ## [5,] 5 ## [6,] 6 |
数列からdimensionを指定してマトリックスをつくる
1, 2, 3, 4, 5, 6という長さが6のベクトルなので、6✕1のほか、2✕3や3✕2、1✕6など様々な次元のマトリックスをつくることができます。
その場合は nrow
で行数を、ncol
で列数を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | m <- matrix(c(1:6)) m ## [,1] ## [1,] 1 ## [2,] 2 ## [3,] 3 ## [4,] 4 ## [5,] 5 ## [6,] 6 |
数列の次元を無理やり指定することでマトリックスをつくることも可能です。
以下は1~10までの整数列の次元を2行✕5列と指定してマトリックスにしています。
1 2 3 4 5 6 7 8 9 10 11 | m <- 1:10 dim(m) <- c(2, 5) m ## [,1] [,2] [,3] [,4] [,5] ## [1,] 1 3 5 7 9 ## [2,] 2 4 6 8 10 |
rbind()とcbind()からマトリックスをつくる
同じデータタイプで同じ長さのベクトルが複数本ある場合は、cbind()かrbind()でベクトルを束ねてマトリックスに仕上げることができます。
cbind()はcolumn bind, rbind()はrow bindの略です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | x <- 1:5 y <- 10:14 cbind(x, y) ## x y ## [1,] 1 10 ## [2,] 2 11 ## [3,] 3 12 ## [4,] 4 13 ## [5,] 5 14 rbind(x, y) ## [,1] [,2] [,3] [,4] [,5] ## x 1 2 3 4 5 ## y 10 11 12 13 14 |
一本のベクトルから行列の数を指定してマトリックスをつくる際には、まず左の列の1行目、2行目…と値が埋められていき、1列目がいっぱいになると2列目の1行目から下に向かって値が埋められていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | mdat <- matrix(c(1, 2, 3, 11, 12, 13), nrow = 2, ncol = 3) mdat ## [,1] [,2] [,3] ## [1,] 1 3 12 ## [2,] 2 11 13 |
matrix() 関数の中では byrow = TRUE
を指定することで行ごとに値を埋める指定もできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | mdat <- matrix(c(1, 2, 3, 11, 12, 13), nrow = 2, ncol = 3, byrow = TRUE) mdat ## [,1] [,2] [,3] ## [1,] 1 2 3 ## [2,] 11 12 13 |
マトリックスの中身を調べる
マトリックスの各成分を取り出したい場合は、何行目の何列目かを指定することでその値にアクセスすることができます。
以下では2行目の3列目の値を取り出しています。
1 2 3 | mdat[2, 3] ## [1] 13 |
次元を調べるには dim()
、マトリックスの構成要素のデータタイプを調べるには typeof()
、そのオブジェクトがマトリックスかどうか調べるには is.matrix()
を使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | dim(mdat) ## [1] 2 3 class(mdat) ## [1] "matrix" typeof(mdat) ## [1] "double" is.matrix(mdat) ## [1] TRUE |
list(リスト)
ベクトルとの違い
Rでは、リストはベクトルと同じく「いくつかの値をしまうことのできる入れ物」として機能します。 しかしatomic vectorとは異なり、リストの内容は単一のデータタイプに制限されず、いくつかのデータ型が混ざった状態を取ることもできます。
リストの作り方(list(), as.list(), vector())
リストは簡単につくることができます。ここでは異なるデータタイプを構成要素に持つ長さが4のリストをつくっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | l <- list(1, "a", F, 1-3i) l ## [[1]] ## [1] 1 ## ## [[2]] ## [1] "a" ## ## [[3]] ## [1] FALSE ## ## [[4]] ## [1] 1-3i |
ベクトルを as.list()
を使って無理やりリストに変換することもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | x <- 1:5 x <- as.list(x) x ## [[1]] ## [1] 1 ## ## [[2]] ## [1] 2 ## ## [[3]] ## [1] 3 ## ## [[4]] ## [1] 4 ## ## [[5]] ## [1] 5 |
class()
と typeof()
を確認してみましょう。両方ともlistとなっています。また length()
で長さを調べることもできます。
1 2 3 4 5 6 7 8 9 10 11 | class(x) ## [1] "list" typeof(x) ## [1] "list" length(x) ## [1] 5 |
「2-1-1. ベクトルの作り方」で、vector()関数を使ってデータタイプと長さを指定すれば空っぽのベクトルをつくることができると学びました。
同様にデータタイプをlistと指定すれば、特定の長さのリストができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | l <- vector("list", length = 3) print(l) ## [[1]] ## NULL ## ## [[2]] ## NULL ## ## [[3]] ## NULL length(l) ## [1] 3 |
リストの要素の取り出し方
リストの中身は、何番目の要素かをカギカッコ []
を二重に使って指定することでを取り出すことができます。
1 2 3 4 5 | x <- list(4, 6, 10, 20) x[[2]] ## [1] 6 |
なぜ [[]]
とカギカッコを二重に使わなくてはならないのでしょうか?試しに二重にしないで使ってみます。
1 2 3 4 5 | x[2] ## [[1]] ## [1] 6 |
結果として出力されたのは、要素が入った長さが1のリストでした。長さが1というのは以下で確認ができます。
1 2 3 | length(x[2]) ## [1] 1 |
また、それはclass()関数を使うことでも確認できます。カギカッコを1重にするのと2重にするのとで違いを見てみましょう。
1 2 3 4 5 6 7 | class(x[[2]]) ## [1] "numeric" class(x[2]) ## [1] "list" |
カギカッコを2重に使うことでデータタイプがnumericだと出力されたので、要素に直接アクセスできていることがわかります。
リスト内の要素に名前をつける、名前の指定で要素を取り出す($)
リストの中身ひとつひとつには名前をつけることができます。以下ではリストの中に3つの要素を入れ、それぞれに名前を付けました。
+ "Japan"という文字列。
名前はa + 1~10までの整数のベクトル。
名前はb + mtcarsというデータセットの抜粋。
名前はdata
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | xlist <- list(a = "Japan", b = 1:10, data = head(mtcars)) xlist ## $a ## [1] "Japan" ## ## $b ## [1] 1 2 3 4 5 6 7 8 9 10 ## ## $data ## mpg cyl disp hp drat wt qsec vs am gear carb ## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 ## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 ## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 ## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 ## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 ## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 |
このように、結果を出力すると $a
, $4b
, $data
のように表示され、それぞれの中身も表示されます。
ではこの状態でリストの最初の要素を抜き出すにはどうしたら良いでしょうか?方法は2つあります。
一つは「2-3-3. リストの要素の取り出し方」で既に学習したように、[[1]]
と入力することです。
1 2 3 | xlist[[1]] ## [1] "Japan" |
2つ目は、名前を指定して要素を取り出す方法です。名前はリストの後に $
を付けて書きます。
1 2 3 4 5 6 7 | xlist$a ## [1] "Japan" xlist$b ## [1] 1 2 3 4 5 6 7 8 9 10 |
リストが含む名前そのものを調べたい場合は、names()
を使います。
1 2 3 | names(xlist) ## [1] "a" "b" "data" |
Data frame
データフレームとは
データフレームはRの非常に重要なデータ構造です。同じ長さのリストが何本も集まってできた特殊なタイプのリストです。
日常のデータの多くはcsvやExcelの形式で保存されていますが、それらのファイルをRで読み込む時にはまずデータフレームとして読み込まれます。
データフレームの詳しい操作方法については別の章で学びますので、ここでは基本的な説明にとどめておきます。
データフレームの基本的な作り方(data.frame)
データフレームを自分でつくるには、data.frame()関数を作ります。以下では、長さが5のリストを3つ使い、datというデータフレームを作っています。
- a, b, c, d, eの文字列リスト
- 1~5までの整数列リスト
- 11~15までの整数列リスト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | dat <- data.frame(id = letters[1:5], x = 1:5, y = 11:15) dat ## id x y ## 1 a 1 11 ## 2 b 2 12 ## 3 c 3 13 ## 4 d 4 14 ## 5 e 5 15 |
typeof()の出力結果から分かる通り、データフレームはlistの特殊形です。
1 2 3 | typeof(dat) ## [1] "list" |
実際によく使うデータフレームの作り方
実際のプロジェクトでは、read.csv()を使ってCSVファイルをデータフレームとして読み込む場合が多いでしょう。
read.csv()の中には読み込みたいCSVファイルのPATHを入れる必要があります。
PATHは現在のプロジェクトがあるworking directoryからの相対PATHでOKです。自分自身でCSVファイルを用意して実際に読み込んでみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # PATHは自分自身のCSVファイルのPATHに変えてください。 PATH <- "data/Presidential Election 2020/president_county.csv" data <- read.csv(file=PATH) head(data) # head()は最初の6行だけを表示します ## state county current_votes total_votes percent ## 1 Delaware Kent County 87025 87025 100 ## 2 Delaware New Castle County 287633 287633 100 ## 3 Delaware Sussex County 129352 129352 100 ## 4 District of Columbia District of Columbia 37762 45392 83 ## 5 District of Columbia Ward 2 29382 37140 79 ## 6 District of Columbia Ward 3 40056 47692 84 |
データフレームを出力すると、各カラム(列)の中身が表示されます。
一番上にはカラム名が表示され、2行目には小さく<int>や<dbl>などとあります。これらは各カラムのデータタイプを表しています。
データフレームからマトリックスへ
データフレームからマトリックスに変換したい場合は as.matrix()
を使います。
data <- mtcars # mtcarsというRにはじめから付いてくる練習用のデータセットを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | m <- as.matrix(head(data)) m ## mpg cyl disp hp drat wt qsec vs am gear carb ## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 ## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 ## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 ## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 ## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 ## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 |
データフレームの中身の調べ方
データフレームの中身を調べる方法はいくつもあります。ここではそのうちの一部を取り上げて説明します。
- head() : 最初の6行を見る
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | head(data) ## mpg cyl disp hp drat wt qsec vs am gear carb ## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 ## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 ## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 ## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 ## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 ## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 |
- tail() : 最後の6行を見る
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | tail(data) ## mpg cyl disp hp drat wt qsec vs am gear carb ## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2 ## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2 ## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.5 0 1 5 4 ## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.5 0 1 5 6 ## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.6 0 1 5 8 ## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.6 1 1 4 2 |
- dim() : データフレームのdimension(行数と列数)を見る
1 2 3 | dim(data) ## [1] 32 11 |
- nrow() : 行数を見る
1 2 3 | nrow(data) ## [1] 32 |
- ncol() : 列数を見る
1 2 3 | ncol(data) ## [1] 11 |
- str() : データフレームの構造(名前、データタイプ、各列の要約)を見る
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | str(data) ## 'data.frame': 32 obs. of 11 variables: ## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... ## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ... ## $ disp: num 160 160 108 258 360 ... ## $ hp : num 110 110 93 110 175 105 245 62 95 123 ... ## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... ## $ wt : num 2.62 2.88 2.32 3.21 3.44 ... ## $ qsec: num 16.5 17 18.6 19.4 17 ... ## $ vs : num 0 0 1 1 0 1 0 1 1 1 ... ## $ am : num 1 1 1 0 0 0 0 0 0 0 ... ## $ gear: num 4 4 4 3 3 3 3 4 4 4 ... ## $ carb: num 4 4 1 1 2 1 4 2 2 4 … |
- names() or colnames() : 列の名前を見る
1 2 3 4 5 | names(data) ## [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" ## [11] "carb" |
- sapply(dataframe, FUN = class) : 各列のデータタイプを見る。 sapply()はFUNで指定した関数をデータフレーム全体に適用できます。ここではclass()関数を各カラムに適用しているため、各カラムのデータタイプが表示されます。
1 2 3 4 5 6 7 8 9 | sapply(data, FUN = class) ## mpg cyl disp hp drat wt qsec vs ## "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" ## am gear carb ## "numeric" "numeric" "numeric" |
データフレームの要素の取り出し方
データフレームの各カラムにアクセスするには、$の後にカラムの名前をタイプします。
1 2 3 4 5 | data_small <- head(data) data_small$mpg ## [1] 21.0 21.0 22.8 21.4 18.7 18.1 |
また例えば1列目のカラムを取り出したい場合、[[1]]とすることもできます。データフレームはリストの拡張形でもあると説明しましたが、これはリストの要素の取り出し方と同じですね。
1 2 3 4 5 6 7 | data[[1]] ## [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 ## [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 ## [31] 15.0 21.4 |
[ ,1]のようにカギカッコの中にカンマ,を入れ、カンマの右側に取り出したい列のインデックスを入れても同じことができます。
1 2 3 4 5 6 7 | data[ ,1] ## [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 ## [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 ## [31] 15.0 21.4 |
データフレームの行にアクセスするには、[1, ]のようにカギカッコの中にカンマ,を入れ、カンマの左側に取り出したい行のインデックスを入れます。
1 2 3 4 5 | data[1, ] ## 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 |
もうおわかりかと思いますが、データフレームのx行目のy列目にある値は[x, y]とすれば取り出すことができます。
1 2 3 | data[1, 3] ## [1] 160 |
Factors
Factorとは
さてデータ構造の最後にFactorについて学びます。ファクターとは、限られた個数の値だけを取る変数のことを言います。性別、1月〜12月までの月の名前など、カテゴリー変数がそれにあたります。
Factorの作り方
ファクターを作るには、通常のベクトルをファクターに変換する方法を取ります。まずEast, West, North, の3つの値を取る変数directionを作ります。
1 2 3 4 5 | direction <- c("East","West","East","North","North","West","West") print(direction) ## [1] "East" "West" "East" "North" "North" "West" "West" |
is.factor()関数でこれがファクターかどうかをチェックします。まだファクターとしては認識されていないのでFALSEが返ってきます。
1 2 3 | print(is.factor(direction)) ## [1] FALSE |
これにfactor()関数を適用することで、ファクターに変換することができます。
1 2 3 4 5 6 7 | factor_data <- factor(direction) print(factor_data) ## [1] East West East North North West West ## Levels: East North West |
変数factor_dataの中身は当初のdirectionと全く同じですが、付随してLevelsという情報も表示されています。このLevelsはファクターを構成する要素の種類を重複抜きで表したものです。Levelsの並び順はアルファベット順です。
そしてis.factor()関数でチェックするとTRUEが返ってくるので、きちんとファクターとして認識されていることが確認できます。
1 2 3 | print(is.factor(factor_data)) ## [1] TRUE |
Factorレベルの順番の変え方
何もしなければ勝手にアルファベット順に並ばれるファクターのLevelsですが、自分の好きな順番に変えることができます。
再度factor()関数にかけ、引数として自分の好きな順番に並べたlevelsを指定すればOKです。
1 2 3 4 5 6 7 | factor_data <- factor(factor_data, levels = c("West", "North", "East")) factor_data ## [1] East West East North North West West ## Levels: West North East |
データタイプを確認すると、きちんとfactorと表示されています。
1 2 3 | class(factor_data) ## [1] "factor" |
データタイプの強制変更
as.<データタイプ>
さて、ここまで様々なデータタイプを見てきましたが、データタイプは一つの型から他の方に強制的に変更することができます。
as.
の後に character()
や integer()
、data.frame()
など変換したいデータタイプを指定することで可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | # numericをcharacterに変換 x <- 10 is.character(x) ## [1] FALSE x <- as.character(x) print(x) ## [1] "10" is.character(x) ## [1] TRUE # characterをnumericに変換 x <- "10" is.numeric(x) ## [1] FALSE x <- as.numeric(x) print(x) ## [1] 10 is.numeric(x) ## [1] TRUE # vectorからlistに変換 v <- c(1, 2, 3) is.list(v) ## [1] FALSE v <- as.list(v) is.list(v) ## [1] TRUE # matrixをdata frameに変換 data <- mtcars is.matrix(data) ## [1] FALSE m <- as.matrix(head(data)) is.matrix(m) ## [1] TRUE |
またデータフレームのあるカラムのデータタイプを変えたい場合は次のようにできます。
1 2 3 4 5 | mtcars$cyl <- as.double(mtcars$cyl) is.double(mtcars$cyl) ## [1] TRUE |
今回はRのオブジェクト概要についてざっくりと紹介しました。
それほどエキサイティングな内容ではありませんでしたが、今回学んだことは今後エラーが出たときにその原因を的確に把握したりするのに非常に役に立ちます。
わからなくなったときは今回の章に立ち戻って復習してみましょう。
今回は以上となります。