Rの型について typeof, mode, class
Rの型についてこれら複数の型分類がある事をご存じでしたか?
data(movielens)
a = movielens
typeof(a)
[1] “list”
mode(a)
[1] “list”
class(a)
[1] “data.frame”
typeof(a$genres)
[1] “integer”
mode(a$genres)
[1] “numeric”
class(a$genres)
[1] “factor”
僕が躓いたのはdslabの中にあるmovielenseの中の型を特定する作業をしていた時
上のように同じmovielens$genresの列に対する型がtypeof, mode, classで全て違ったのです
どうしてこうなるんだ!?
そこで簡単に調べてみました
typeof:オブジェクトに対する型
mode:オブジェクトに格納されている要素に対する型
class:オブジェクトの属性に対する型
とのことです
なるほど、分からん
そこでもう少し詳細に調べてみました
typeとclassの違い
typeはRにおける内的な「タイプ」を表していて
classはどのような「タイプ」であるかを定義/識別するために使用します(Rでのオブジェクト指向プログラミングの観点から用います)
a$genres = as.character(a$genres)
typeof(a$genres)
[1] “character”
mode(a$genres)
[1] “character”
class(a$genres)
[1] “character”
列を定義しなおすと全て変わります
a$genres = as.integer(a$genres)
警告メッセージ:
強制変換により NA が生成されました
typeof(a$genres)
[1] “integer”
mode(a$genres)
[1] “numeric”
class(a$genres)
[1] “integer”
もちろんas.integerを用いてinteger型に定義しなおすことは可能ですが
中の要素が元々character型でしたのでNAエラーが出ています
ここで出てきたtypeとmodeの違い(integerとnumeric)は後述します
基本的にはtypeはそもそもの型、classは自由に定義できる型と捉えるのがよさそうです
typeとmodeの違い
class(x)
[1] “integer”
typeof(x)
[1] “integer”
mode(x)
[1] “numeric”
重要な事はmodeではinter, doubleをnumericと表すことですね
mode を実行すると typeof 関数と同様に基本型を示す仕様とのことですが、その部分だけ違います
なんでこんなややこしいことになっているかというと、S言語(Becker, Chambers & Wilks)との互換性のためにmodeの型があるようです
まとめ
typeof:オブジェクトに対する型
mode:ほぼオブジェクトに対する型(S言語との互換性の問題から設定)
class:オブジェクトの属性に対する型(定義可能)
One describes a physical characteristic while the other is a logical characteristic of an object.
イメージとしては上記の記述が分かりやすいでしょうか
typeは物理的な型、classは論理的な型
という事です
実用的に超要約すると、modeはRを使う上ではどうでも良い、typeが外枠でclassが中身
という雰囲気でしょうか
掲示板を見るとR userから何て分かりにくいんだ!と海外からもクレームが入っていますね
3つの型の話題で人類は一つになれるかもしれません
ベクトルとリスト、マトリックスとデータフレーム
型、という事で余談ですが
ここで型を理解する上で重要なベクトルとリストについてについてです
ベクトルはatomic vectorと言われ、原子ベクトルというようにRにおけるデータの最小単位です
そしてベクトルはその中に同じ型しか内包出来ません
その観点で言うとmatrixはベクトルの集合体といえます
それに対して複数の型を内包出来る入れ物をlistと言います
listの集合体がdata frameです
参考文献
https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Attributes
python: https://atmarkit.itmedia.co.jp/ait/articles/1907/12/news019.html
https://stats.biopapyrus.jp/r/basic/data-type.html
https://qiita.com/maruman029/items/365a2abcdaaf99b720be
https://renenyffenegger.ch/notes/development/languages/R/data-structures/vector/