前回の記事から第2章が始まりました。

第1章:Rの基本的な使い方について知る
第2章:データの扱いに慣れる

【2-1】Rのfor関数、apply関数を使ってまとめて標準偏差などの統計量を求める方法


スクリーンショット 2019-02-08 10.33.40

今回は「合計」など新たな列を追加したり、すでにある列を修正するmutate関数について紹介します。

mutate関数は前回の記事でも行ったパイプ演算子(%>%)と一緒に使うことが多いので、パイプ演算子の練習の意味も含めて紹介していきます。


今回は前回の記事のデータを使います。

data01.xlsx 

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

library(readxl)
data01 <- read_excel("data01.xlsx", sheet = "日本語")
data01$性別 <- factor(data01$性別, levels = c("男性","女性"))
data01$歩行 <- as.factor(data01$歩行)
head(data01)

*注意
もしプロジェクトファイルを作成していない場合はgetwd()と打ち込むと作業フォルダが表示されます、作業フォルダにExcelデータを入れると後は同じです。

getwd()


1.mutate関数を使ってBMIの列を作る

library(tidyverse)  #既に実行していたらなくても可
data01_bmi <- mutate(data01, BMI = 体重 / (身長 / 100)^2)
data01_bmi

スクリーンショット 2019-02-08 13.51.51
つまり今回は以下の3つは同じ意味になります。
data01_bmi <- mutate(data01, data01$BMI = data01$体重 / (身長 / 100)^2)
data01_bmi <- mutate(data01, BMI = .$体重 / (.$身長 / 100)^2)
data01_bmi <- mutate(data01, BMI = 体重 / (身長 / 100)^2)


スクリーンショット 2019-02-08 11.14.23

2乗は ^ を使います。
5の2乗は5^2となりますが、5 ^ 2のようにスペースは空けずにくっつけて使います
+ - * / は前後にスペースを入れて使います()
, は,の後にだけスペースを入れます。前に入れません
%>%はくっつけて使い、前後にスペースを入れます


data01 <- mutate(・・・)とdata01自体を修正すると、コードを振り返る時にどこからがBMIを追加する前のdata01で、どこからがBMIを追加した後のdata01かわからなくなるので、今回は新たにdata01_bmiという変数名を作りました。


1つ注意点なのですが、変数名や列の名前にカンマ( , )やドット( . )、ハイフン( - )をつけないようにしましょう。これらは計算式とご認識されて後でめんどくさいことになります。
対策としてはアンダーバー( _ )を使います。



1−2.パイプ演算子とmutate関数をで同じことをする

今度はパイプ演算子を使って同じことをします。

パイプ演算子(%>%)は解析の流れをスムーズにしてくれます。
データ① %>%
    プログラム② %>%
    プログラム③ %>%
    プログラム④
とすると先程のdata01_selectの用な変数を介することもなく、データ①をプログラム②に送り、その結果をプログラム③に送り、その結果をプログラム④に送るといったことが可能になります
【2-1】Rのfor関数、apply関数を使ってまとめて標準偏差などの統計量を求める方法より引用

library(tidyverse)  #既に実行していたらなくても可
data01_bmi <- data01 %>% mutate(BMI = 体重 / (身長 / 100)^2)
data01_bmi

スクリーンショット 2019-02-08 14.02.31
スクリーンショット 2019-02-08 14.10.43


同じ結果になります。

%>%なんでめんどくさいのでは・・・?と思うかもしれませんが、今回はmutate関数1行で終わる課題だからです。何行もかかるプログラムの時に効果を発揮します。

下の2つのケースではapply関数の後「あれ、小数点以下多すぎ!」となったので結果をそのまま%>%でつないでround関数を使おう!といった使い方ができます。

スクリーンショット 2019-02-05 0.57.27

スクリーンショット 2019-02-05 1.13.08

【2-1】Rのfor関数、apply関数を使ってまとめて標準偏差などの統計量を求める方法


2.既にある列を修正する

次は既にある列を修正します。

今回は以前も紹介した型の変更を行います。
このページの最初に使ったコードをパイプ演算子を使うと以下のようになります。

比較してみてください。
library(readxl)
data01 <- read_excel("data01.xlsx", sheet = "日本語")
data01$性別 <- factor(data01$性別, levels = c("男性","女性"))
data01$歩行 <- as.factor(data01$歩行)
head(data01)

library(tidyverse)
library(readxl)
data01 <- read_excel("data01.xlsx", sheet = "日本語")
data01 <- data01 %>% 
  mutate(性別 = factor(.$性別, levels = c("男性","女性"))) %>% 
  mutate(歩行 = as.factor(.$歩行))
head(data01)
スクリーンショット 2019-02-08 15.05.44

今回は型の修正だけなので、data01に上書きしました。

mutate関数の列の追加か修正は名前が既にあるものであれば「修正(上書き)」され、無いものであれば新しく列が追加されます。


まとめ

今回はmutate関数とパイプ演算子の使い方を練習しました。

修正はdata01$性別 <- 〇〇でもいいのですが、パイプ演算子でつなぎたい場合はmutate関数を使うと覚えておくとわかりやすいです。

mutate関数を使うと「FIMの合計点」とかだけでなく、年齢を「年代ごとに分類する」だったり、ある評価の「カットオフ値以上とそれ以下」に分けた列をExcelを使わずに作成することができます。

 次回もmutate関数を使ってそのような新しい列の作成を行っていきます。

前回は今までの総復習を行いました。
【演習】R初心者が統計をかけるための前準備の流れを復習します : 独学で始める統計×データサイエンス



上記の記事を進めると以下のように統計量をまとめて出すことができますが、summary関数では標準偏差が出ません。
スクリーンショット 2019-02-04 21.49.17


今回は標準偏差を出すいろいろな方法を復習も含め紹介します。

繰り返しのfor関数やapply関数、パイプ演算子(%>%)もはじめて出てきますが、使えるようになるとFIMのような項目が多いものでも1度にまとめて解析できるようになり、いよいよExcelではできない体験をすることができるようになります。

まだ今回の内容であればExcelでも可能ですが、1つずつ進めていきましょう。

1.sd関数で1つずつ出す
2.for関数で繰り返す
3.apply関数を使う
4.tableoneパッケージを使う


今回は前回の記事のデータを使います。

data01.xlsx 

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

library(readxl)
data01 <- read_excel("data01.xlsx", sheet = "日本語")
data01$性別 <- factor(data01$性別, levels = c("男性","女性"))
data01$歩行 <- as.factor(data01$歩行)
summary(data01)

*注意
もしプロジェクトファイルを作成していない場合はgetwd()と打ち込むと作業フォルダが表示されます、作業フォルダにExcelデータを入れると後は同じです。

getwd()




1.sd関数で1つずつ出す

標準偏差を出す関数はsd関数です。

sd(ベクトル)
sd(data01[[3]])
sd(data01[[4]])
sd(data01[[5]])
sd(data01[[6]])
sd(data01[[7]])
sd(data01[[8]])
スクリーンショット 2019-02-04 21.53.36


data.frameからベクトルを表示するには$または[[ ]]を使います。
[[ ]]の中の数字は列番号です。
$でもいいのですが、このようなケースでは列番号のほうが手っ取り早いです。

列番号を確認するにはnames関数t関数(もしくはdata.frame関数)を使うと便利です。

t(names(data01))
スクリーンショット 2019-02-04 23.20.52

data.frame(names(data01))
スクリーンショット 2019-02-04 23.22.06


2.for関数で繰り返す

1個ずつ出すのもいいですが、繰り返しになる作業はfor関数で繰り返すことができます。
for(i in 3:8){
  x <- sd(data01[[i]])
  print(x)
  }

for関数は(◯ in △)と{}の2つに別れています。
スクリーンショット 2019-02-04 23.51.05
スクリーンショット 2019-02-04 23.59.46


スクリーンショット 2019-02-05 0.03.59

ただ結果は出るのですが結果の数字しか出ません。


3-1.apply関数を使う

library(tidyverse)
apply(data01, 2, sd)

スクリーンショット 2019-02-05 0.17.43

スクリーンショット 2019-02-05 0.08.54


下にエラーが出ます。これは「氏名と性別で集計できないからNAにしてますよ!」と怒られています。なのでselect関数で集計する列だけ抜き出します。


library(tidyverse) #既に実行していたらなくても可
data01_select <- select(data01, 3:8) data01_select apply(data01_select, 2, sd)
スクリーンショット 2019-02-05 0.32.27

今回はdata01_selectという変数名にselect関数で3〜8列目だけ抜き出しapply関数を使いました。


スクリーンショット 2019-02-05 0.33.14


ただこの方法はdata01_selectのように間に変数を挟む必要があります。
tidyverseパッケージはこれをスッキリさせるパイプ演算子(%>%)というものがあります。


3−2.パイプ演算子を使ったapply関数

パイプ演算子(%>%)は解析の流れをスムーズにしてくれます。

データ① %>%
    プログラム② %>%
    プログラム③ %>%
    プログラム④

とすると先程のdata01_selectの用な変数を介することもなく、データ①をプログラム②に送り、その結果をプログラム③に送り、その結果をプログラム④に送るといったことが可能になります

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

スクリーンショット 2019-02-05 0.55.55
スクリーンショット 2019-02-05 0.57.27


もし四捨五入するならround関数を使います。

library(tidyverse)#既に実行していたらなくても可
data01 %>% #data01に対して
  select(3:8) %>% #3列目(年齢)〜8列目(MMSE)までを選択し
  apply(., 2, sd) %>% #それぞれの列で標準偏差を求めて!
  round(.,2) #小数点2位より下を四捨五入する
スクリーンショット 2019-02-05 1.13.08


4.tableoneパッケージを使う

tableoneパッケージを使うのも1つの方法です。

tableoneパッケージについてはこの記事で紹介しています。
Rで医療統計で必要なtable1を作るtableoneパッケージについて紹介します : 独学で始める統計×データサイエンス

library(tableone)
CreateTableOne(data = data01,
               vars = c("年齢", "身長", "体重", "SIAS", "BBS", "MMSE"))
スクリーンショット 2019-02-05 1.20.05


まとめ

今回は標準偏差を出すいろいろな方法を通じてfor関数やapply関数、パイプ演算子の使い方を紹介しました。

今回は標準偏差(sd)でしたが、平均(mean)や中央値(median)など他の統計量も求めることができます。

for関数やtidyverse(dplyrなど)に関してはまとまった記事もありますが、これからもちょくちょく出てくると思います。その都度復習しながら使い方のイメージを付けていただければいいかと思います。








これまで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で使うパッケージのインストールについて紹介します。









↑このページのトップヘ