Rは,こちらがそれほど厳密にデータの型を意識しなくても,良い感じに処理してくれる。とくに,読み込んだデータに対して,記述統計量を求めたり回帰分析を行ったりするには,数値と文字列の違いとファクター,欠損値の扱いを理解していれば十分なことも多いと思うが,データ型に起因するトラブルもよくあるので,簡単に理解しておくと良い。
Rでは,データの型には大きく分けて以下の4つがある。
- 数値型 (numeric)
- 文字列型 (character)
- 論理型 (logical)
- 因子型 (factor)
数値型,文字列型,因子型 (ファクター)についてはすでにRの基本でも触れたが,ここで再度整理しておく。
数値型 (numeric)
一般的に数値はnumeric型として扱う。何も指定せずに変数に数値を代入すれば,変数はnumeric型となる。整数型 (integer)や倍精度浮動小数点数型 (double)といった型もあるが,整数は当然numeric型で扱うことができるし,doubleはnumericと同じなので,ほとんどの場合はnumeric型を使えば問題ない。
文字列型 (character)
文字列はcharacter型として扱う。文字列はダブルクオート" "
で囲って表す。数字も" "
で囲うと文字列として扱われる。
論理型 (logical)
論理型は,TRUE
かFALSE
のどちらか一方の値をとる二値変数。内部的にはTRUE
は1,FALSE
は0として扱われる。条件分岐やサンプルの抽出に使われる。
# 論理型の例
x <- 0
logical_var1 <- (x == 1)
logical_var1
logical_var2 <- (x == 0)
logical_var2
## 論理和 (少なくともどちら一方が正しければTRUEになる)
logical_var1 | logical_var2
## 論理積 (両方が正しければTRUEになる)
logical_var1 & logical_var2
## 否定 (TRUEならFALSE,FALSEならTRUEになる)
! logical_var1
## TRUEは1,FALSEは0の数値として扱われる (型変換する必要はない)
logical_var1 + 2
# 条件分岐に使う
if (logical_var1) {
print("TRUEです")
} else {
print("FALSEです")
}
if (logical_var2) {
print("TRUEです")
} else {
print("FALSEです")
}
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]
因子型 (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
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_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)
number <- factor(number, levels = c(4, 2, 1, 5))
class(number)
変数の型を変換するには,as.numeric()
, as.character()
, as.logical()
, as.factor()
などの関数を用いる。
number <- c(2, 2, 1, 4, 5)
number
party <- c("民主党", "自民党", "自民党", "自民党", "自民党")
party
[1] "民主党" "自民党" "自民党" "自民党" "自民党"
# 数値型を文字列型に変換
number_chr <- as.character(number)
number_chr
# 文字列型を数値型に変換
number_num <- as.numeric(number_chr)
number_num
# 文字列型を因子型に変換 as.factor()関数はlevelsを指定できないことに注意
party_factor <- as.factor(party)
party_factor
[1] 民主党 自民党 自民党 自民党 自民党
Levels: 民主党 自民党
# 因子型を数値型に変換 levelsの順序を表す数値に変換される
party_num <- as.numeric(party_factor)
party_num
## 数値型を因子型に変換して,それを再度数値型に変換
### 元の数値ではなく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