Sponsored Links
データ型の分類
Rで扱うデータの型は様々あって、型の分類の仕方は以下の3種類があります[1]。
- 基本型(typeof)
- モード(mode)
- クラス(class)
()内はそれぞれの分類方法に従って型を調べるコマンドです。例えば以下のような感じです。
> a <- 1:4 # 1:4は1から4までの整数を作る命令。
> typeof(a)
[1] "integer"
> mode(a)
[1] "numeric"
> class(a)
[1] "integer"
# 別の例
> b <- c(1.1, 3.2, 7.1) # c()でベクトルを作る。
> typeof(b)
[1] "double"
> mode(b)
[1] "numeric"
> class(b)
[1] "numeric"
このように複数の分類方法がややこしくて理解できていません。いくつかの記事[2],[3]を参考に勉強したのですが。
[1] 永田 晴久 – R の「型」について [2] Masashi Nakanishi – 計処理ソフト R 入門 講習会資料 [3] – R ことはじめ(横田博史)
Sponsored Links
データ型の種類
データ型の分類方法はさておき、代表的なデータは以下の種類があります[1]。
- double(実数)
- integer(整数)
- numeric(実数と整数)
- character(文字)
- logical(論理)
- vector(ベクトル)
- list(リスト)
- matrix(マトリクス)
- data.frame(データフレーム)
- factor(順序なし因子)
- ordered(順序あり因子)
double型
Rで数値を直接打ち込むと基本的にdouble型として認識されます。
> 1.0==1 # ==は比較の演算子で、等しい場合はTRUE、等しくない場合はFALSEが返される。
[1] TRUE
> 1.0==0.9999999999999999 # 小数点以下に9を16個並べても、1と等しいとは認識しない。
[1] FALSE
> 1.0==0.99999999999999999 # 小数点以下に9を17個並べると、1と等しいと識別してしまう。
[1] TRUE
> 0/0 # 0/0(0÷0)はNaN(不定値)という特殊な数値。
[1] NaN
> 1/0 # 1/0(1÷0)はInf(無限大)という特殊な数値。
[1] Inf
# この他、欠損値NAもある。
Integer型
整数の型です。double型との区別はあいまいですが、 整数を生成する演算子や関数により、数値を整数として設定した場合、Integer型になります。
> x1 <- 1:1 # :により1から1までの整数を作る。この場合は、1だけ作れられる。
> x1
[1] 1
> x2 <- 1 # x2には数値1を指定。
> x2
[1] 1
> is.integer(x1) # is.integer関数で整数であるかどうかを確認。
[1] TRUE
> is.double(x1) # is.double関数で数値であるかどうかを確認。
[1] FALSE
> is.integer(x2)
[1] FALSE
> is.double(x2)
[1] TRUE
# 演算子:を用いる以外にも、seq関数により、seq(始点, 終点)と設定すると整数が生成される。
numeric型
numeric型はdouble型とinteger型を合わせた型です。
> x1 <- seq(1, 5) > x1 # seq関数でseq(始点, 終点)と設定すると、整数が作られる。
[1] 1 2 3 4 5
> x2 <- seq(1, 5, length=4) > x2 # seq関数でseq(始点, 終点)にオプションとしてlenghで生成する数値の長さを指定するとdouble型になる。
[1] 1.000000 2.333333 3.666667 5.000000
> is.integer(x1) # integer型かどうか確認。
[1] TRUE
> is.double(x1) # double型かどうか確認。
[1] FALSE
> is.numeric(x1) # numeric型かどうか確認。
[1] TRUE
> is.integer(x2) # integer型かどうか確認。
[1] FALSE
> is.double(x2) # double型かどうか確認。
[1] TRUE
> is.numeric(x2) # numeric型かどうか確認。
[1] TRUE
character型
引用符で囲うとcharacter型になる。
> x1 <- 1 # 数値1を指定。
> x2 <- "1" # ""で囲んで文字として指定。
> is.character(x1) # character型かどうかを確認。
[1] FALSE
> is.numeric(x1) # numeric型かどうかを確認。
[1] TRUE
> is.character(x2) # character型かどうかを確認。
[1] TRUE
> is.numeric(x2) # numeric型かどうかを確認。
[1] FALSE
logical型
TRUE(真)、FALSE(偽)の論理型です。TRUE、FALSEはそれぞれT、Fと略して記述できます。論理値を返す比較の演算子には以下のものがあります。
== | 等しい |
!= | 等しくない |
>= | 以上 |
<= | 以下 |
> | 大 |
< | 小 |
> 1 == 2
[1] FALSE # 1と2は等しくないのでFALSEが返される。
> sqrt(4) == 2
[1] TRUE # 4の平方根は2と等しいのでTRUEが返される。
> (1 == 2) == FALSE
[1] TRUE # 1と2は等しいはFALSEなので、TRUEが返される。
> (1 != 2) == TRUE
[1] TRUE # 1は2とは等しくないので、TRUEが返される。
vector型
c()で囲まれた1行(1次元)のデータセットをvector型と呼びます。
> a <- c(2, 4, 1, 3, 7) # aに数値データのベクトルを指定。
> a
[1] 2 4 1 3 7
> b <- c("a", "b", "c") # 文字は""で囲む。
> b
[1] "a" "b" "c"
> c <- c(1, 3, "a", "b") > c # 数値と文字が混在しているベクトル。
[1] "1" "3" "a" "b" # 数値は文字として認識される。
list型
list型はvector型c()と同じように書くことができるが、数値、文字、論理値など複数の成分が混在していても良い。さらに、matrix型やdata.frame型が混在しても良い。
> list(1, 2, 3) # 数値を指定。
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
> list(1, "2,3", "山", TRUE, F) # 数値、文字列、論理値が混在している。c()なら全て文字列になる。
[[1]]
[1] 1 # 数値として認識されている。
[[2]]
[1] "2,3" # 見た目は数値だが""で囲まれると文字列として認識される。
[[3]]
[1] "山" # 文字列と認識される。
[[4]]
[1] TRUE # TRUEは論理値として認識される。
[[5]]
[1] FALSE # Fは論理値として認識され、FALSEとフルスペルで表記される。
matrix型
表や行列を表現するためにmatrix型とdata.frame型があります。
matrix型は、matrix(データ, 行数, 列数)もしくはmatrix(データ, nrow=行数, ncol=列数)で設定します。matrix関数は指定したデータを1列目から順番に縦に埋めていきますが、1行目から順番に横に埋めたい場合には、byrow=TRUEのオプションを付けます。デフォルトではbyrow=FALSEに設定されているということです。
> matrix(1:9, 3, 3) # 1:9で1から9までの整数を作る。
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> matrix(1:9, 3, 3, byrow=TRUE) # byrow=TRUEを指定すると1列目から順番に横にデータを埋める。
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
> matrix(1:9, 2, 3) # 指定した行と列がデータ数より少ない場合は、途中まで埋める。
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
警告メッセージ:
matrix(1:9, 2, 3) で:
データ長 [9] が行数 [2] を整数で割った、もしくは掛けた値ではありません
> matrix(1:7, 3, 3) # 指定した行と列がデータ数より多い場合は、データを埋めた後、最初に戻り、データを入れる。
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 1
[3,] 3 6 2
警告メッセージ:
matrix(1:7, 3, 3) で:
データ長 [7] が行数 [3] を整数で割った、もしくは掛けた値ではありません
> matrix(list(1,2,3,"a","b","c",T,F,T),3,3) # List型で指定すれば文字列や論理値も混在させることができる。
[,1] [,2] [,3]
[1,] 1 "a" TRUE
[2,] 2 "b" FALSE
[3,] 3 "c" TRUE
data.frame型
数値データ、文字列データ、因子データなど様々な型のデータを含めることができます。外観はmatrixに似ていますが、行や列にラベルが付けられていることが特徴です。data.frame関数は以下のような構文で書きます。
- data.frame(データ列1, データ列2,…..データ列n)
- data.frame(列名1=データ列1, 列名2=データ列2,…..列名n=データ列n)
- data.frame(列名1=データ列1, 列名2=データ列2,…..列名n=データ列n, row.names=行名)
> x1 <- c("東", "西", "南", "北") # ベクトルx1を作る。
> x2 <- c(12, 9, 14, 15) # ベクトルx2を作る。
> data.frame(x1, x2) # x1とx2を列にしてdata.frameを作る。
x1 x2
1 東 12
2 西 9
3 南 14
4 北 15
> data.frame(方角=x1, 数値=x2) # x1とx2を列にしてdata.frameを作る。それぞれの列に名前を設定する。
方角 数値
1 東 12
2 西 9
3 南 14
4 北 15
> x3 <- c("方角1", "方角2", "方角3", "方角4") # 行名使用するベクトルx3を作る。
> data.frame(方角=x1, 数値=x2, row.names=x3) # x3を行名として設定し、data.frameを作る。
方角 数値
方角1 東 12
方角2 西 9
方角3 南 14
方角4 北 15
factor型
factor型は順序なし因子の型です。factor型の構造は分かり難ですが、以下のコマンド例を試すと、なんとなく実感できました。[2],[3]
> f1 <- c("normal", "good", "fair", "poor", "trace", "zero") # ベクトルf1を作成。
> f2 <- factor(f1) # ベクトルf1をfactor型に変換し、f2に代入。
> f2 # f2を確認。
[1] normal good fair poor trace zero # 指定されたベクトルが含まれている。
Levels: fair good normal poor trace zero # 水準の並び順はアルファベット順。
> is.factor(f2) # f2がfactor型かどうか確認。
[1] TRUE # factor型。
> mode(f2) # データ型の分類の一つであるモード分類における型を調べる。
[1] "numeric" # 数値。ひょっとしてベクトルf1の文字をソートしてから順番に数値を振って、それにラベルを付けているのか?
> class(f2) # データ型の分類の一つであるクラス分類における型を調べる。
[1] "factor" # クラス分類ではfactor型。
> f3 <- factor(f2, levels = c("normal", "good", "fair", "poor", "trace", "zero")) # 今度は、オプションlevels=で水準を指定し、f3に代入。
> f3 # f3を確認。
[1] normal good fair poor trace zero
Levels: normal good fair poor trace zero # 今度は水準の並び順が指定した通りの順番。
ordered型
factor型は因子水準を表示する順番を指定できますが、大小関係までは定義できません。大小関係も定義するにはordered型を使います[4]。
> f0 <- c(2,4,3,3,2,1,3,2,3) # ベクトルを生成。
> f1 <- factor(f0, levels = c(1,2,3,4) ,labels = c("falling", "passing", "good", "excellent")) # f0に対し、levelsオプションを使い数字順に水準を指定、labelsオプションを使い成績を仮定したラベルを指定。
> f1 # f1を確認。
[1] passing excellent good good passing falling good passing
[9] good
Levels: falling passing good excellent # factor関数で指定した順番で水準が記述されている。
> f1[f1 > "passing"] # f1の中で"passing"より大きいものを表示するように演算子を指定。
[1] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
Levels: falling passing good excellent
警告メッセージ: # エラーメッセージが出る。
Ops.factor(f1, "passing") で: ‘>’ not meaningful for factors
> o1 <- as.ordered(f1) # f1をordered型に変換。
> o1[o1 > "passing"] # o1の中で"passing"より大きいものを表示するように演算子を指定。
[1] excellent good good good good # エラーなく抽出された。
Levels: falling < passing < good < excellent # 因子の順序が表示される。
> is.factor(f1) # f1はfactor型である。
[1] TRUE
> is.ordered(f1) # f1はordered型でない。
[1] FALSE
> is.factor(o1) # o1はfactor型である。
[1] TRUE
> is.ordered(o1) # o1はordered型である。
[1] TRUE
ordered型はfactor型でもあるんですね。
[1] hamadakoichi blog – R言語プログラミング: データ型・操作 [2] TauStation – R – 因子型(Factor型) [3] 土屋政雄 – 因子型変数の水準の順序(levels)を変える [4] TauStation – R – 因子型(Factor型)
データ型の確認と変換
前項のRコマンドでもいくつか紹介しましたが、データの種類の確認方法と変換方法を説明します。mode関数やclass関数で確認できますが、以下のように一つ一つ指定して確認もできます。
- is.double(実数)
- is.integer(整数)
- is.numeric(実数と整数)
- is.character(文字)
- is.logical(論理)
- is.vector(ベクトル)
- is.list(リスト)
- is.matrix(マトリクス)
- is.data.frame(データフレーム)
- is.factor(順序なし因子)
データを変更するためには、以下の関数を使います。
- as.double(実数)
- as.integer(整数)
- as.numeric(実数と整数)
- as.character(文字)
- as.logical(論理)
- as.vector(ベクトル)
- as.list(リスト)
- as.matrix(マトリクス)
- as.data.frame(データフレーム)
- as.factor(順序なし因子)
Sponsored Links