Rのデータ型

データ型の分類

 

Rで扱うデータの型は様々あって、型の分類の仕方は以下の3種類があります[1]。

  • 基本型(typeof)
  • モード(mode)
  • クラス(class)

()内はそれぞれの分類方法に従って型を調べるコマンドです。例えば以下のような感じです。

R Console
> 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 ことはじめ(横田博史)

 

データ型の種類

データ型の分類方法はさておき、代表的なデータは以下の種類があります[1]。

  • double(実数)
  • integer(整数)
  • numeric(実数と整数)
  • character(文字)
  • logical(論理)
  • vector(ベクトル)
  • list(リスト)
  • matrix(マトリクス)
  • data.frame(データフレーム)
  • factor(順序なし因子)
  • ordered(順序あり因子)

double型

Rで数値を直接打ち込むと基本的にdouble型として認識されます。

R Console
> 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型になります。

R Console
> 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型を合わせた型です。

R Console
> 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型になる。

R Console
> 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と略して記述できます。論理値を返す比較の演算子には以下のものがあります。

== 等しい
!= 等しくない
>= 以上
<= 以下
>
<
R Console
> 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型と呼びます。

R Console
> 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型が混在しても良い。

R Console
> 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に設定されているということです。

R Console
> 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=行名)
R Console
> 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]

R Console
> 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]。

R Console
> 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.xxx関数で該当するデータかどうかを論理値で返す
  • is.double(実数)
  • is.integer(整数)
  • is.numeric(実数と整数)
  • is.character(文字)
  • is.logical(論理)
  • is.vector(ベクトル)
  • is.list(リスト)
  • is.matrix(マトリクス)
  • is.data.frame(データフレーム)
  • is.factor(順序なし因子)

 

データを変更するためには、以下の関数を使います。

as.xxx関数で該当するデータに変換する
  • as.double(実数)
  • as.integer(整数)
  • as.numeric(実数と整数)
  • as.character(文字)
  • as.logical(論理)
  • as.vector(ベクトル)
  • as.list(リスト)
  • as.matrix(マトリクス)
  • as.data.frame(データフレーム)
  • as.factor(順序なし因子)
[1] biostatistics | バイオスタティスティクス | 生物統計学 – データ型 | R のデータ型・モード・クラス

[2] R-Tips – 25. データ型とデータ構造

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください