データの型

Rは,こちらがそれほど厳密にデータの型を意識しなくても,良い感じに処理してくれる。とくに,読み込んだデータに対して,記述統計量を求めたり回帰分析を行ったりするには,数値と文字列の違いとファクター,欠損値の扱いを理解していれば十分なことも多いと思うが,データ型に起因するトラブルもよくあるので,簡単に理解しておくと良い。

Rでは,データの型には大きく分けて以下の4つがある。

数値型,文字列型,因子型 (ファクター)についてはすでにRの基本でも触れたが,ここで再度整理しておく。

数値型 (numeric)

一般的に数値はnumeric型として扱う。何も指定せずに変数に数値を代入すれば,変数はnumeric型となる。整数型 (integer)や倍精度浮動小数点数型 (double)といった型もあるが,整数は当然numeric型で扱うことができるし,doubleはnumericと同じなので,ほとんどの場合はnumeric型を使えば問題ない。

文字列型 (character)

文字列はcharacter型として扱う。文字列はダブルクオート" "で囲って表す。数字も" "で囲うと文字列として扱われる。

論理型 (logical)

論理型は,TRUEFALSEのどちらか一方の値をとる二値変数。内部的にはTRUEは1,FALSEは0として扱われる。条件分岐やサンプルの抽出に使われる。

# 論理型の例

x <- 0

logical_var1 <- (x == 1)
logical_var1
[1] FALSE
logical_var2 <- (x == 0)
logical_var2
[1] TRUE
## 論理和 (少なくともどちら一方が正しければTRUEになる)
logical_var1 | logical_var2
[1] TRUE
## 論理積 (両方が正しければTRUEになる)
logical_var1 & logical_var2
[1] FALSE
## 否定 (TRUEならFALSE,FALSEならTRUEになる)
! logical_var1
[1] TRUE
! logical_var2
[1] FALSE
## TRUEは1,FALSEは0の数値として扱われる (型変換する必要はない)
logical_var1 + 2
[1] 2
logical_var2 * 4
[1] 4
# 条件分岐に使う

if (logical_var1) {
  print("TRUEです")
} else {
  print("FALSEです")
}
[1] "FALSEです"
if (logical_var2) {
  print("TRUEです")
} else {
  print("FALSEです")
}
[1] "TRUEです"
if(logical_var1 & logical_var2) {
  print("どちらもTRUEです")
} else {
  print("少なくともどちらか一方はFALSEです")
}
[1] "少なくともどちらか一方はFALSEです"
# ベクトル要素の抽出

name <- c("野田", "安部", "菅", "岸田", "石破")
party <- c("民主党", "自民党", "自民党", "自民党", "自民党")

## statusの各要素が"自民党"であるかどうかを論理値のベクトルで表す
LDP <- (party == "自民党")
LDP
[1] FALSE  TRUE  TRUE  TRUE  TRUE
## nameベクトルからLDPベクトルのTRUEに対応する要素を抽出
name[LDP]
[1] "安部" "菅"   "岸田" "石破"
##  自民党の人数を数える
sum(LDP)
[1] 4

因子型 (factor)

男性か女性や,出身都道府県など,カテゴリを表すときには因子型を使うのが便利だ。因子型ベクトルは,factor()関数で作成できる。

# 因子型の例
party <- c("民主党", "自民党", "自民党", "自民党", "自民党")
party_factor <- factor(party)
party_factor
[1] 民主党 自民党 自民党 自民党 自民党
Levels: 民主党 自民党

partyは政党を表す因子型(factor型)変数となる。Levels: にはカテゴリが列記されている。この場合,partyは「民主党」と「自民党」の二つのカテゴリに分類される。

数値であっても,factorとして扱うことができる。

number <- c(2, 2, 1, 4, 5)
number
[1] 2 2 1 4 5
number_factor <- factor(number)
number_factor
[1] 2 2 1 4 5
Levels: 1 2 4 5

table()関数で表を作成したり,ggplot2パッケージでグラフを作成する場合,カテゴリの順番を並べ替えが必要なことはよくある。順番を指定したいときには,levelsオプションを用いる。

party <- c("民主党", "自民党", "自民党", "自民党", "自民党")
party_factor1 <- factor(party)
table(party_factor1)
party_factor1
民主党 自民党 
     1      4 
party_factor2 <- factor(party, levels = c("自民党", "民主党"))
table(party_factor2)
party_factor2
自民党 民主党 
     4      1 
number <- c(2, 2, 1, 4, 5)
table(number)
number
1 2 4 5 
1 2 1 1 
number_factor <- factor(number, levels = c(4, 2, 1, 5))
table(number_factor)
number_factor
4 2 1 5 
1 2 1 1 

型の確認と変換

変数の型は,class()関数で確認できる。

number <- c(2, 2, 1, 4, 5)
class(number)
[1] "numeric"
number <- factor(number, levels = c(4, 2, 1, 5))
class(number)
[1] "factor"

変数の型を変換するには,as.numeric(), as.character(), as.logical(), as.factor()などの関数を用いる。

number <- c(2, 2, 1, 4, 5)
number
[1] 2 2 1 4 5
class(number)
[1] "numeric"
party <- c("民主党", "自民党", "自民党", "自民党", "自民党")
party
[1] "民主党" "自民党" "自民党" "自民党" "自民党"
class(party)
[1] "character"
# 数値型を文字列型に変換
number_chr <- as.character(number)
number_chr
[1] "2" "2" "1" "4" "5"
class(number_chr)
[1] "character"
# 文字列型を数値型に変換
number_num <- as.numeric(number_chr)
number_num
[1] 2 2 1 4 5
class(number_num)
[1] "numeric"
# 文字列型を因子型に変換 as.factor()関数はlevelsを指定できないことに注意
party_factor <- as.factor(party)
party_factor
[1] 民主党 自民党 自民党 自民党 自民党
Levels: 民主党 自民党
class(party_factor)
[1] "factor"
# 因子型を数値型に変換 levelsの順序を表す数値に変換される
party_num <- as.numeric(party_factor)
party_num
[1] 1 2 2 2 2
class(party_num)
[1] "numeric"
## 数値型を因子型に変換して,それを再度数値型に変換
### 元の数値ではなくlevelsで指定した順番の数値になることに注意
number_factor <- factor(number, levels = c(4, 2, 1, 5))
number_factor
[1] 2 2 1 4 5
Levels: 4 2 1 5
number_num <- as.numeric(number_factor)
number_num
[1] 2 2 3 1 4
class(number_num)
[1] "numeric"