1.2 データ型

1.2.1 数値型と文字型

これまで扱ってきたベクトルに格納しているデータはすべて整数型実数型でした。Rでは文字列もデータとして扱うことができ、文字型(character)のデータと呼びます。文字型のデータはダブルクォート"で囲むことによって表現します。

s <- c("Kasumi", "Nadeshiko", "Kashii")
s
## [1] "Kasumi"    "Nadeshiko" "Kashii"

アトミックベクトルは、単一のデータ型のみを格納します。数値型と文字型が混在したベクトルを作成しようとすると、数値型が文字型に強制変換されます。

c("Happy", "New", "Year", 2021)
## [1] "Happy" "New"   "Year"  "2021"

typeof()関数によってオブジェクトの型を確認してみます。

typeof(x)
## [1] "double"
typeof(s)
## [1] "character"

1.2.2 因子型

統計データを扱うR言語独特のクラス(データ構造を拡張したようなもの)として、因子型(factor)があります。統計学においては、データをその性質から

  • 名義尺度:分類コードやIDとして用いられる数値(血液型や性別など)
  • 順序尺度:名義尺度に順序に関する情報が追加された数値(成績など)
  • 間隔尺度:差の演算結果に意味がある数値(摂氏の気温など)
  • 比例尺度:比の演算結果に意味がある数値(長さ重さなど、0が何もないを表すもの)

の4種類に分類するという考え方が一般的です。名義尺度と順序尺度の値を持つ変数のことを質的変数と呼び、因子型は質的変数を扱うためのデータ型となっています。

# 数値型から因子型ベクトルを作成
hakata <- c(0, 2, 3, 1, 3, 2, 1, 2)
fhakata <- factor(hakata, levels = 0:3)
fhakata
## [1] 0 2 3 1 3 2 1 2
## Levels: 0 1 2 3

この例では、最初に数値型のベクトルを作成し、それをfactor()関数で因子型のベクトルに変換しています。factor()関数のlevels引数は、水準集合のベクトルを指定します。この場合、0という数値が1番目の水準に、1という数値が2番目の水準というように割り当てられることを意味します。

因子型のベクトルの場合、内容を表示するとLevelsの行のように水準集合が合わせて表示されるので、これでデータが因子型かどうかを見分けることができます。

attributes(fhakata)
## $levels
## [1] "0" "1" "2" "3"
## 
## $class
## [1] "factor"
as.numeric(fhakata)
## [1] 1 3 4 2 4 3 2 3
as.numeric(as.character(fhakata))
## [1] 0 2 3 1 3 2 1 2

attributes()関数を使うと、引数で指定されたオブジェクトの属性一覧を表示することができます。fhakatalevelsclassの2つの属性を持っていることが確認できます。因子型の実体は、水準番号(1,2,3・・・)をベクトルの要素として持ち、水準番号に対応した水準集合を属性として持っているようなオブジェクトになります。

as.numeric()関数で因子型ベクトルを数値型ベクトルに変換すると、水準番号が出力されます。元のデータを出力する場合には、as.character()関数で一旦文字型ベクトルに変換してから、数値型ベクトルに変換します。

levels関数を使うと、水準集合を参照したり更新したりすることができます。

levels(fhakata)
## [1] "0" "1" "2" "3"
levels(fhakata) <- c("天ぷら", "もつ鍋", "ラーメン", "ごまさば")
fhakata
## [1] 天ぷら   ラーメン ごまさば もつ鍋   ごまさば ラーメン もつ鍋   ラーメン
## Levels: 天ぷら もつ鍋 ラーメン ごまさば
as.numeric(fhakata)
## [1] 1 3 4 2 4 3 2 3

質的変数のデータは、元々は文字列として記録されていることが多いかもしれません。文字型ベクトルをfactor()関数で因子型に変換すると、出現した要素全てが水準集合に含まれるようになります。

fhakata_char <- c("天ぷら", "もつ鍋", "ラーメン", "ごまさば", "ラーメン")
factor(fhakata_char)
## [1] 天ぷら   もつ鍋   ラーメン ごまさば ラーメン
## Levels: ごまさば もつ鍋 ラーメン 天ぷら

上で述べたように、因子型の実体は水準番号なので、typeof()関数でfhakataのデータ型を確認するとintegerとなります。一方、class()関数でfhakataのクラスを確認するとfactorとなります。

typeof(fhakata)
## [1] "integer"
class(fhakata)
## [1] "factor"

1.2.3 論理型

TRUEFALSEあるいはそれらの省略形としてTFは、論理型(logical)と呼ばれるデータ型の値であり、それぞれ真(True)と偽(False)を表現するために用いられます2

logical_sample <- c(TRUE, FALSE, T, T, F, F)
logical_sample
## [1]  TRUE FALSE  TRUE  TRUE FALSE FALSE

1.2.4 欠損値の表現について

実際に統計データを扱う際には、何らかの理由で一部のデータが観測されなかったり、個人情報保護の目的で一部のデータが提供されていなかったりすることがあります。このようなデータを表現するために、Rでは欠損値を意味する値NAが用いられます。

x <- c(2, 5, 10, NA, 3, 2)
x
## [1]  2  5 10 NA  3  2

NAを含んだベクトルに対して演算や集計をした場合は次のようになります。

y <- 1:6
x + y
## [1]  3  7 13 NA  8  8
sum(x)
## [1] NA
mean(x)
## [1] NA

sum()関数やmean()関数で欠損値を無視して計算したい場合には、引数でna.rm = TRUEを指定します。

sum(x, na.rm = TRUE)
## [1] 22
mean(x, na.rm = TRUE)
## [1] 4.4

因子型ベクトルを作成するとき、数値型のベクトルに水準集合に含まれない要素がある場合には、因子型ベクトルの中では欠損値として扱われます。

factor(c(2, 3, 5, 2), levels = 1:4)
## [1] 2    3    <NA> 2   
## Levels: 1 2 3 4

  1. ダブルクォートがついていないので文字型ではないことに注意↩︎