タグ:data.frame

今までRでデータの変数名を変更したり条件でグループ化したりしました。






ここからは集計して平均や標準偏差などの要約を出したり、グラフを作るための準備に進みます。


こういったグラフを作るにはもう1つ工夫が必要です。

それはwideデータをlongデータに変更することです。

今回はlongデータとwideデータの違いを知り、longデータに変換するgather関数を紹介します。




1.wideデータとlongデータ

wideデータというのは1つのid(たとえば患者氏名)に対してデータが横に並びます。

スクリーンショット 2019-02-20 0.03.06
これはまた別の架空のデータです。4人にあるテストを3回ずつ行った設定です。

データを入力したり人の目で見る時はwideデータがわかりやすいです。

ただ今後出てくるのですが、Rではグラフを作るときに「『回数』で色分けして!」とか「『回数』で別々のグラフを作って」みたいな指定ができます。そのためにはlongデータが便利になります。


2.gather関数とspread関数

スクリーンショット 2019-02-20 0.53.33

wideをlongに変えるのがgather関数で、longをwideに戻すのがspread関数です。

ここで大切になるのがkey = と value=です。

key = も valueもlongデータの変数名に当たる部分です。wideデータにはそれに当てはまる名前を入れる欄がなく、列を分けることで表示しています。



3.gather関数の使い方

gather(使うデータ名, くっつける列, key = 要素の変数名,value = テストの値)



スクリーンショット 2019-02-20 1.12.43


まずくっつける列を指定します。
くっつける列は列名でも列番号でもどちらでも構いません。

key = は「1回目、2回目、3回目」に当たる部分の列の名前です。
ここでは回数としました。

value = は実際のデータに当たるところの列の名前です。
ここでは点数としました。


library(tidyverse)
氏名 <- c("A", "B", "C", "D")
年齢 <- c(55, 63, 67, 71)
test_1回目 <- c(1:4)
test_2回目 <- c(5:8)
test_3回目 <- c(9:12)

data <- data_frame(氏名, 年齢, test_1回目, test_2回目, test_3回目)

data %>% 
  gather(3:5, key = 回数, value = 点数) 

スクリーンショット 2019-02-20 1.29.48

変数名の頭を数字にするとRに怒られますので、1回目とせずtest_1回目としています。

それと今回data.frame関数ではなくdata_frame関数を使っています。
どちらも基本的には変わりませんが、data_frame関数はtidyverseパッケージに含まれている関数で、プログラミング初心者であれば少し機能が高いものといった程度で構わないと思います。data.frameとしても大丈夫です。



4.spread関数の使い方

スクリーンショット 2019-02-20 1.26.47

spread関数はlongデータから戻します。

data %>%
gather(3:5, key = 回数, value = 点数) %>% 
  spread(key = 回数, value = 点数)
  スクリーンショット 2019-02-20 1.40.16


gather関数でlongデータにしたものをそのままspread関数でwideデータに戻しました。

そのためもとのdataに戻っています。


5.実際にやってみる

今回はExcelで架空のデータを作りました。

FIM.xlsx

スクリーンショット 2019-02-19 22.25.41


データには氏名・年齢・性別・時期とFIM(18項目の評価と運動項目合計、認知項目合計、全体の合計)が入っています。運動合計は1~13項目目の合計、認知は14~18項目目の合計、FIM合計は18項目の合計です。
そしてタブには「入院時・1ヶ月・退院時」というタブがあります。


ダウンロードした後、プロジェクトの指定フォルダにファイルを移動させておけば、以下のコマンドで上記の画面まで進みます。今回は入院時のデータのみ使います。

liburary(tidyverse)
library(readxl)
fim <- read_excel("FIM.xlsx", sheet = "入院時")
view(fim)


まずどんなデータか確認してみます。

head(fim)
str(fim)
スクリーンショット 2019-02-20 1.54.48

スクリーンショット 2019-02-20 1.55.46

100 obs. of  25 variablesと書いてあるので100人のデータで25列あるということです。

列が多いので、列番号も取得します。
列番号を取得する時はt関数とnames関数の組み合わせが便利です。
またはdata.frame関数とnames関数の組み合わせでもできます。

t(names(fim))
data.frame(names(fim))

スクリーンショット 2019-02-20 2.01.28


この中で5列目の「食事」から25列目の「FIM合計」まではいってしまえば全部FIMというテストの点数です。

なので、これを全部gather関数でまとめてlongデータに変えます。

ここではkeyを回数、valueを点数という列名にしました。好きな名前で構いません。
下の結果を見て、keyとvalueの関係を確認してみてください。

fim_long <- fim %>% 
  gather(食事:FIM合計, key = 項目, value = 点数) 

スクリーンショット 2019-02-20 23.00.29


氏名〜時期までは変わっていませんが、5列目〜25列目がなくなり、代わりに「項目」と「点数」という列ができています。

またA tibble: 2,100 x 6となっており、2100行×6列の表に変わりました。
だいぶ縦長に変わりました。


まとめ

今回はlongデータ、wideデータの説明とgather関数(spread関数も)を紹介しました。

まだこれだけではメリットがわからないと思います。

しかし次に行うgroup_by関数とsummarize関数を行う時やグラフを作る時にこの作業が大きな意味を持つことになります。

次回はこのデータを使って要約(グループごとの平均や標準偏差など)をしていきます。


追記

gather関数のkey = でつなげた要素は五十音順になっている


gather関数でlongデータにした場合、key =に当たる部分の要素はどうなっているのでしょうか?

class(fim_long$項目)
スクリーンショット 2019-02-20 23.30.38


項目は"character"(文字列)となっています。

そしてこのままグラフを作ると下の左の図のように並びが五十音順となります。
これでは困ります。できれば右図のようにもとの順で並べたいところです。

スクリーンショット 2019-02-20 22.22.01



gather関数にfactor_key = TRUEをつける


gather関数内でfactor_key = TRUEを加えるとkeyの列をfactor型にし、順番も元の順番になります。
https://tidyr.tidyverse.org/reference/gather.html より

fim_long <- fim %>% 
  gather(食事:FIM合計, key = 項目, value = 点数, factor_key = TRUE) 
fim_long

class(fim_long$項目)
スクリーンショット 2019-02-21 1.27.33


こうすると集計やグラフ作成で順番が崩れずに表示することができます。

これまでRの基本的な使い方について紹介しました。

はじめてのRStudio。基本的な画面の説明をします

Rコマンダーの基本的な画面の説明を行います

Rstudioのプロジェクトについて解説します

R の「変数」について説明します。

医療統計をRで使うために必要な「データフレーム」にの考え方ついて

Rで使うパッケージのインストールについて紹介します。

今回は上記の復習として実際にエクセルデータを読み込んでデータの型の変更を行ってみたいと思います。

しっかりRを使っている人はデータハンドリング(データを整理したり、wideデータ⇔longデータの変換)に関してもRを使いますし使うことを推奨されていますが、自分も含めRが初心者で「研究ですぐにでも使いたい」という方は「Excelでデータを整理してRで統計解析する」というのもありなのかなと思っています。

その場合は今回の記事である程度準備できると思います。

スクリーンショット 2019-02-04 0.50.30

ここで復習すること

・プロジェクトの作成
・スクリプトウィンドウの使い方
・エクセルデータの読み込み
・データの確認
・型の変更


まだ説明できていないこと

データハンドリング
・wideデータとlongデータ
・新しい列の作成(合計など)
・欠損値の取り扱い方




1.プロジェクトを作る

File → New Projectを選ぶ
スクリーンショット 2018-12-24 17.50.53


New Directoryを選択
スクリーンショット 2018-12-24 17.51.11


New Projectを選択
スクリーンショット 2018-12-24 17.51.18


今回は「練習01」という名前のプロジェクトを作ります。
スクリーンショット 2019-02-04 1.32.32

スクリーンショット 2019-02-04 1.37.46

プロジェクトができましたがスクリプトがありません。
プロジェクトを作ります。

スクリーンショット 2019-02-04 1.51.40

完成!
スクリーンショット 2019-02-04 1.51.57

スクリプトファイルも名前をつけて保存しておきます。
スクリーンショット 2019-02-04 20.38.53


2.Excelファイルを読み込む

仮のエクセルデータを作成しています。
文字化け対策に「英語」のタブも用意しています。


data01.xlsx 


スクリーンショット 2019-02-04 3.27.54


ダウンロードした後、Excelファイルをプロジェクトで作成したフォルダに入れます。
するとFilesタブにエクセルファイルが追加されています。
スクリーンショット 2019-02-04 20.40.09


Excelファイルを読み込むにはImport Datasetを選択します。
スクリーンショット 2019-02-04 20.41.23


Nameで名前を作ります。ここではdata01で進めます。
Sheetで使うタブを選択しましょう。
選択したら右の赤枠を丸ごとコピーしてスクリプトに貼り付けておきましょう。
そうすればExcelファイルを再読込する時にこの作業を行わなくてよくなります。
スクリーンショット 2019-02-04 20.46.45

スクリーンショット 2019-02-04 20.59.43
スクリーンショット 2019-02-04 20.57.16

これでdata01というdata.tableが完成しました。


3.データの確認

data01のデータを確認してみましょう

head(data01)
str(datao1)
スクリーンショット 2019-02-04 21.05.35

head関数は最初数行を表示してstrは各ベクトルの情報を表示してくれます。


summary(data01)
スクリーンショット 2019-02-04 21.10.50

summaryは数値やfactor型の要約を出してくれます。標準偏差は出ません。

Min:最小値
1st Qu.:第一四分位数
Median:中央値
Mean:平均
3rd Qu.:第三四分位数
Max:最大値

氏名・性別はclassがcharacterなので要約が出ていません。
また歩行は0:非自立、1:自立とカテゴリー変数なのですが、数値として認識されています。
次は性別・歩行をfactorに変更します。


4.カテゴリー変数をfactorに変更する

data01$性別 <- as.factor(data01$性別)
data01$歩行 <- as.factor(data01$歩行)

str(data01$性別)
str(data01$歩行)
スクリーンショット 2019-02-04 21.25.45

data.frameの列を取り出すのは$もしくは[[ ]]でした。
factorに変更するにはas.factor関数を使います。

もう一度summaryを見てみましょう。

summary(data01)
スクリーンショット 2019-02-04 21.28.54

性別と歩行がカテゴリーとしてみなされています。

性別を見ると女性→男性の順になっています。
これで良ければこれでいいのですが、もし男性→女性に並べ替えたい時はas.factor関数ではなくfactor関数を使います。

(他にも「自立・非自立」やFIMなど評価の並ぶ順番がある場合はも並べ替えることがあります)

data01$性別 <- factor(data01$性別, levels = c("男性","女性"))
str(data01$性別)

スクリーンショット 2019-02-04 21.34.16


最後にsummary関数で確認します。

summary(data01)

性別が男性→女性の並びになっています。

スクリーンショット 2019-02-04 21.49.17


ちなみに標準偏差をまとめて出す方法は次回紹介予定ですが、以下に1例を紹介します。

library(tidyverse)
data01 %>% #data01に対して
  select(3:8) %>% #3列目(年齢)〜8列目(MMSE)までを選択し
  apply(., 2, sd) #それぞれの列で標準偏差を求めて!

スクリーンショット 2019-02-04 22.15.29


%>%とか見たこと無いものが出てきましたがまた次回ということで。


まとめ

今回の内容は全て今までの記事で紹介された内容の復習です。。

難易度はいかがでしたでしょうか。

ここまでがスムーズにできると、後の分析やグラフ作成がスムーズに進むと思います

わからなかったところは以下にリンクを再掲していますので確認してみてください。


はじめてのRStudio。基本的な画面の説明をします

Rコマンダーの基本的な画面の説明を行います

Rstudioのプロジェクトについて解説します

R の「変数」について説明します。

医療統計をRで使うために必要な「データフレーム」にの考え方ついて

Rで使うパッケージのインストールについて紹介します。









Rで医療統計を行う場合ExcelでデータをとりRで読み込んで使うといった方法がほとんどだと思います。

EZRやRコマンダーで統計を行うときは気にしなくてもいいのですが、RやRStudioで統計を行うときは「ベクトル」や「データフレーム(data.frame)」といった知識があると理解が進みやすいです。

今回はdata.frameとベクトルについて解説していきます。


data.frameとは?

スクリーンショット 2019-01-16 21.03.13


簡単にいうとExcelの表みたいな形式です。行(横)×列(縦)の形式になっています。

スクリーンショット 2019-01-15 2.05.16
EZRやRコマンダーを使う方はエクセルのデータを読み込んでいると思いますが、これがdata.frameになります。


data.frameのお約束

縦の列に変数名

縦の列に変数名を入れることです。基本逆にはしません。


一番上は変数名にする

一番上が変数名になるのでそれぞれ違う名前にしましょう。空欄もないように。
また変数名が2段にならないようにしましょう。


変数名に「空白」を使わない

Rでは変数名に空欄があると読み込めなかったりするので「 _ 」などを使う方がエラーが出にくいです。
「 ー 」もマイナスの記号と間違われる可能性があります。


Excelのセルは絶対に結合しない!

一番上の変数名も含めてどの部分でも結合はしないようにしましょう!

スクリーンショット 2019-01-16 23.55.25


エクセルに「平均」「標準偏差」を計算しない

Rで簡単に求められます。またエクセルには実データだけ入れないと、Rに集計の行が入り逆にRでの集計が正しくできません。


ベクトルとは?

スクリーンショット 2019-01-17 23.20.12


上記のように1つのベクトルには複数のデータが入っています。

ベクトルを使うときはc()を使います。

年齢 <- c(65, 46, 86, 76, 45)
性別 <- c("男性", "女性", "女性", "男性", "女性")


となっていれば上のエクセルみたいなものだとイメージします。
ちなみに文字として認識させるには" "が必要です。


そしてdata.frameはベクトルの集合体とも言えます。

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

データフレームをエクセルでなくRで作るときは

①それぞれの列(ベクトル)をつくる。

②data.frame関数でくっつける


といった方法で作成することができます(それぞれのデータの数は同じににしましょう)。
氏名 <- c("山田", "鈴木", "吉田", "田中", "山口")
年齢 <- c(65, 46, 86, 76, 45)
身長 <- c(165, 147, 163, 158, 173)
体重 <- c(48, 50, 62, 64, 67)
性別 <- c("男性", "女性", "女性", "男性", "女性")
data <- data.frame(氏名, 年齢, 身長, 体重, 性別)
data

> data 氏名 年齢 身長 体重 1 山田 65 165 48 2 鈴木 46 147 50 3 吉田 86 163 62 4 田中 76 158 64 5 山口 45 173 67




$と[[ ]]について

では「data.frameの年齢」を取り出すにはどうすれば良いのでしょうか?

これは$または[[ ]]を使います。二重括弧です。

スクリーンショット 2019-01-18 0.51.35

RStudioだと、data.frameの変数に$をつけると変数名が出ます(すごく便利!)。

スクリーンショット 2019-01-18 0.55.32

またdata.frameの変数に[[1]]を入れると「1列目」という意味になります。


dataの中身が以下だったとします。
氏名 年齢 身長 体重 1 山田 65 165 48 2 鈴木 46 147 50 3 吉田 86 163 62 4 田中 76 158 64 5 山口 45 173 67


data$年齢 data[[2]]

> data$年齢 [1] 65 46 86 76 45 > data[[2]] [1] 65 46 86 76 45
同じ結果が出ます。



data.frameと医療統計

Rで医療統計を行う場合はdata.frameの形になっていることがほとんどです。次はこれがどう医療統計とつながるかをみていきます。

平均を出す場合

スクリーンショット 2019-01-18 1.15.12


t検定を使う場合

スクリーンショット 2019-01-18 1.06.20


相関係数を見る場合

スクリーンショット 2019-01-18 1.06.27


具体的な検定は今後紹介していきますが、今回はRで統計をかける場合は縦の列が重要になることがイメージできれば良いかと思います。




data.frameでよく使う関数

data.frameを使うときの代表的な関数を紹介します。

head()

head()はdata.frameの最初の数行を表示してくれます。


str()

str()は各列の型やデータの一部を一覧で教えてくれます。
型に関しては今後説明していきます。

names()

names()は列の名前(変数名)を一覧で出してくれます。
変数名なんだっけ?


dplyr::mutate()

mutate()は新たな変数を作るったり、既存の列を更新することができます。
たとえばFIMの各項目から合計点を出したり、FIM6点以上を"自立"にする、年齢を10代,20代とグループ分けするなんてこともできます。

dplyr::filter()

filterはdata.frameの中から条件にあった行だけを取り出します。
たとえば男性だけのデータを抜き出すことができます。

dplyr::select()

select()はdata.frameの中から選んだ列だけを取り出します。
たとえばdata.frameの列が多すぎる時に分析に使う列だけ取り出したりできます。


dplyr::group_by()

group_by関数はグループ分けをします。たとえばデータを性別毎に分けることができます。


dplyr::summarise()

summarise関数はグループ毎の平均や標準偏差をまとめて出すことができます。



ちなみにdplyr::というのはdplyrというパッケージを使うという意味なのですが、パッケージも今後紹介していきます。パッケージというのはRの機能を拡張してくれます。


何が言いたいかというとExcelで基本となるデータを1つ作ることができたら、Rの中でデータの加工したり、グループ分けしたり、集計・統計ができるということです。そのためエクセルのファイルを分析ごとにコピーしたりせずに済みます!コピーしすぎて「元データどれだ・・・?」となったりしません。


まとめ

今回はdata.frameについて紹介しました。

data.farameはRを使う上で必ず必要になり、第2章以降のデータはほぼ全てがdata.frameを使っています。
まだ使い方になれないと思いますが、記事を読み進めながら徐々に理解を深めていただければと思います。


次回もRを使う上で非常に大切な考え方である型について紹介します。



全ての記事一覧はこちらです。
 






↑このページのトップヘ