日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

オブジェクトの属性

Rはオブジェクトで計算処理を実現しますが、数値以外には文字や因子を持ちます。

  • 数値

数字からなるオブジェクトで四則演算などの算術処理が可能です。数値の大小で順位を持ちます。

> x <- sample(20,4)#sampple関数は1~10の整数から疑似乱数にしたがって4つ選ぶ
> y <- sample(20,4)
> x;y
[1]  6 16  2 11
[1]  3 14 15  1
> x + y#四則演算できる
[1] 15 16 22 33
> sort(x)#数値の大小で順序が決まる
[1]  9 30 17 12
  • 文字

文字からなるオブジェクトです。四則演算はできません。順序はコード順で決まります。

> x <- as.character(x)#as.characterは文字列に変換する関数
> y <- as.character(y)
> x;y#“(ダブルクオート)が付いて文字列になったことが分かります。
[1] "6"  "16" "2"  "11"
[1] "3"  "14" "15" "1" 
> x + y
 以下にエラー x + y :  二項演算子の引数が数値ではありません 
#文字列になったので四則演算をできません。
> sort(x)
[1] "11" "16" "2"  "6" 
#数値とは違って、10は1と0の文字になり、1は2より前なので、11が2よりに前なります。
  • 因子

順序変数に相当するものです。数値や文字の順序を指定でき、それぞれに数値の順序が付与されます。

> factor(x)
[1] 6  16 2  11
Levels: 11 16 2 6
> str(factor(x))
 Factor w/ 4 levels "11","16","2",..: 4 2 3 1
> levels(factor(x))
[1] "11" "16" "2"  "6"
> labels(factor(x))
[1] "1" "2" "3" "4"

因子は数値や文字と違って、levelとlabelを持ちます。
levelは各因子の大小関係を示し、labelは各因子に相当するラベルになります。
上の例は、オブジェクトxが既に文字列になっているので、大乗関係が 11 -> 16 -> 2 -> 6 です。
つまり、11が1、16が2、2が3、6が4というラベルが付与されているので、変換の仕方で結果が変わります。

> as.numeric(factor(x))
[1] 4 2 3 1
> as.character(factor(x))
[1] "6"  "16" "2"  "11"
  • 論理値

いわゆるTRUE(真)とFALSE(偽)です。
ただ、Rでは入力の規定値として、TRUEをTでFALSEをFで指示できます。
ですから、TRUEでもTでも同じ結果を返します。

> (x <- c(TRUE,FALSE,TRUE,TRUE))
[1]  TRUE FALSE  TRUE  TRUE
> (y <- c(T,F,T,T))
[1]  TRUE FALSE  TRUE  TRUE

ただ、同時にTとFが特殊な意味を持つことになるので、オブジェクトを作るときはT、もしくはFを避けたほうが無難です。

> x[2] <- TRUE
> x
[1] TRUE TRUE TRUE TRUE
> x[2] <- T
> x
[1] TRUE TRUE TRUE TRUE

このように通常はTRUEでもTでも代入可能ですが、

> (T <- LETTERS[1:4])
[1] "A" "B" "C" "D"
> x[2] <- TRUE
> x
[1] TRUE TRUE TRUE TRUE
> x[2] <- T
 警告メッセージ:
In x[2] <- T :
   置き換えるべき項目数が,置き換える数の倍数ではありませんでした

Tが文字ベクトルになったため、エラーになってしまいます。