前回、医療統計でよく使われるdata.frameについて説明しました。

医療統計をRで使うために必要な「データフレーム」にの考え方ついて : 独学で始める統計×データサイエンス



記事でも紹介しましたが、data.frameはベクトルの集合体とも言えます。

スクリーンショット 2018-08-29 19.54.22

各列には「氏名(文字)、年齢(数値)、性別(男性/女性の2カテゴリー)」など色々な種類のデータが入っています。Rで統計を行うときにはこのデータの型を理解する必要があります。

今回はデータの型について説明します。




医療統計で使われる代表的な型

スクリーンショット 2019-01-25 3.04.20


numeric(実数)

例)
  • 身長
  • 体重
  • 歩行速度
  • 年齢
numericは数字のことです。numericの特徴としては四則演算(+,-,×,÷)ができます。
また1と2の間隔と2と3の間隔は同じです。

またnumericには小数点以下がある実数(double)と整数(integer)でも使えます。


character(文字)

例)
  • 氏名
  • 文字
  • "1"
文字にあたるものはcharacterとなります。数字でも"1"のように""で挟むとcharacterとして認識されます。
スクリーンショット 2019-01-25 3.21.40
上記ではaは文字で1は数字なので「計算できません」とエラーが出ます。

スクリーンショット 2019-01-25 3.24.09
上記ではaに1という文字を入れたのでやはり計算できません。



factor / order

例)
  • 男性/女性
  • 右/左
  • 年齢(10代,20代〜)
  • 1:不満足/2:やや満足/3:満足
  • 数値で分類している場合(0:非自立,1:自立)
factor /order型はグループ分けしている時に使います。「1:不満足」を2倍をしても「2:やや満足」にならず四則演算ができないのも特徴です。

factorは性別など順序がないものに使われ、orderは順番があるもの(10代〜、5段階評価など)に使われます。


logical

スクリーンショット 2019-01-25 14.56.28

logicalの代表的なものにTRUE とFALSEがあります。
年齢 < 60 とすることで、60未満をTRUE、それ以外をFALSEとなります。
TRUEは1、FALSEは0とみなすことができ、sum関数でTRUEの合計を、mean関数で割合(ここでは2/5=0.4)を出すことができます。

TRUE/FALSE以外にもExcelのセルが空欄の時に表示されるNULLがあります。



0とNULLの違いはこのツイートが最強です。



class()とstr()

ではどうやって型を確認すればいいのでしょうか?これはclass関数やstr関数を使います。


class()

スクリーンショット 2019-01-25 3.31.53

上記のようにclass(変数名)とします。

aとbは同じ1でも型が違うのがわかります。



str()

上記でも紹介しましたが、data.frameはベクトルの集合体とも言えます。

スクリーンショット 2018-08-29 19.54.22

各列には「氏名(文字)、年齢(数値)、性別(男性/女性の2カテゴリー)」など色々な種類のデータが入っています。Rで統計を行うときにはこのデータの型を理解する必要があります。

str関数は各列(ベクトル)の型をまとめて調べることができます。

スクリーンショット 2019-01-25 14.45.20

右上の表をdataという変数名に入れています。

赤枠で囲ったところに型があります。

性別を見るとfactorで"女性"と"男性"の2カテゴリーであることがわかります。



型を変更するas.〜関数

型を変えるにはas.〜関数を使います。

as.character()

先程のstr(data)の氏名を見ると型はfactorになっています。これをcharacterに変えてみます。

コード
スクリーンショット 2019-01-25 19.28.57

結果
スクリーンショット 2019-01-25 19.29.10

data$氏名がわかりにくかったら医療統計をRで使うために必要な「データフレーム」にの考え方ついてを参照してください。

単にas.character(data$氏名)とするだけでは不十分です。

data$氏名 <- as.character(data$氏名)とすることでas.character(data$氏名)をdata$氏名に入れてね!という意味になります。


もしdata$氏名 <− を入れなかったら・・・
スクリーンショット 2019-01-25 19.48.13

結果
スクリーンショット 2019-01-25 19.52.56
data$氏名 <− を入れないと最後の結果が更新されていません。

つまりas.character(data$氏名)だけだとdata$氏名をcharacterにした結果を出してまでの意味しかないので注意してください。



as.numeric()

数値に変える時はas.numericを使います。

コード
スクリーンショット 2019-01-25 19.42.28

結果
スクリーンショット 2019-01-25 19.41.32


もし整数にしたい時はas.integerを使います。小数点切り捨てです。
スクリーンショット 2019-01-25 20.47.18

スクリーンショット 2019-01-25 20.47.36



as.factor / factor / ordered

factor型に変更するにはas.factor、factor、orderedなどを使います。


スクリーンショット 2019-01-25 23.06.24

dataに歩行という列を追加しています。
ここでは0:非自立、1:監視、2:自立としています。


スクリーンショット 2019-01-25 23.11.11

スクリーンショット 2019-01-25 23.10.53

最初はnumericと数値でしたが、as.factor関数を使うことでfactorに変わっています。
ここではclassではなくstr(data$歩行)で型を確認しています。

strを使うと型がfactorということだけでなく、levelsを見ると0,1,2の3つのカテゴリーがあることもわかります。

ただ0,1,2のままではグラフなどが困ります。その時はfactor関数(as.factorではないです)のlabelsを使うことでデータは0,1,2のまま表記を変えることができます。

スクリーンショット 2019-01-25 23.55.20

スクリーンショット 2019-01-25 23.55.11


スクリーンショット 2019-01-26 0.03.06


ちなみにfactorの順番はアルファベット順になってます。
0,1,2などは問題ないのですが、大,中,小などでは小→大→中など望ましくない順番になることがあります。性別は女性→男性となっています。

factorの並び順を変更するにはfactor関数のlevelsを使います。

スクリーンショット 2019-01-26 0.08.33

スクリーンショット 2019-01-26 0.09.27

スクリーンショット 2019-01-26 0.10.33



また並び順に意味がある場合はordered = TRUEを付け加えます。


スクリーンショット 2019-01-26 0.49.54

スクリーンショット 2019-01-26 0.50.41



EZRだと?

スクリーンショット 2019-01-26 1.17.11

EZRではアクティブデータセット→変数の操作にあたります。
赤枠の「データセット内の変数を一覧する」はstr()を使っているだけです。


まとめ

今回は型について説明を行いました。

エクセルから読み込んだ時はまずstrで型を確認してみてはいかがでしょうか。