合同会社DILIGENCEでは一緒に働く仲間を募集しています
実験で得られた被験者の時系列の生体情報の必要な箇所を抜き出す。1名の被験者のデータであっても、必要な箇所を抜き出すというのはなかなか大変。dplyrパッケージを使って必要なデータの抽出を試みた。ちなみに、コードは下記の通り。今までエクセルとマクロを組み合わせて作業していたが、これもまた超便利。
#まずはパッケージ読み込み.
> library(dplyr)
#今回はheader情報のついていないCSVデータをコピーしてみた.
> dat<-read.csv("clipboard",header = FALSE,sep = " ")
> head(dat)
V1 V2 V3 V4 V5
1 1957 686 114.38 82.99 67.29
2 2655 698 116.79 82.90 65.96
3 3369 714 115.07 82.52 66.24
4 4095 726 113.20 81.32 65.38
5 4793 698 110.36 80.50 65.57
6 5452 659 112.11 81.75 66.57
#header情報をつけてみる.
> dat<-rename(dat,time=V1,rri=V2,sbp=V3,mbp=V4,dbp=V5)
#左から,時間,RR間隔,右の3つは血圧データということになる.ただし,時間はmsec表示になっている.
> head(dat)
time rri sbp mbp dbp
1 1957 686 114.38 82.99 67.29
2 2655 698 116.79 82.90 65.96
3 3369 714 115.07 82.52 66.24
4 4095 726 113.20 81.32 65.38
5 4793 698 110.36 80.50 65.57
6 5452 659 112.11 81.75 66.57
#さらに,mutate関数でdatのデータにデータの追加をする.一つは,rr間隔からheart rateを算出し,時間データをmsecからsecに変換したものを追加.
> dat<-mutate(dat,hr=60000/rri,sec=time/1000)
#結果はこんな感じ.
> head(dat)
time rri sbp mbp dbp hr sec
1 1957 686 114.38 82.99 67.29 87.46356 1.957
2 2655 698 116.79 82.90 65.96 85.95989 2.655
3 3369 714 115.07 82.52 66.24 84.03361 3.369
4 4095 726 113.20 81.32 65.38 82.64463 4.095
5 4793 698 110.36 80.50 65.57 85.95989 4.793
6 5452 659 112.11 81.75 66.57 91.04704 5.452
#ちょっとややこしいが,ベースライン,介入,リカバリーがどこなのかを記載したデータを追加する.mutate関数でデータの追加(periodsというデータ).
#ifelse関数とbetween関数を組み合わせ,300~360秒までをbaseline,600~660秒までをintervention,720~780秒までをrecoveryとした.
> dat<-mutate(dat,periods=ifelse(between(sec,300,360),"baseline",ifelse(
+ between(sec,600,660),"intervention",ifelse(between(sec,720,780),"recovery",""))))
#そうすると今感じになる.当然,300秒先にならないとbaselineが無いため,periodsは何も内容に見えているが,実際はちゃんとある.
> head(dat)
time rri sbp mbp dbp hr sec periods
1 1957 686 114.38 82.99 67.29 87.46356 1.957
2 2655 698 116.79 82.90 65.96 85.95989 2.655
3 3369 714 115.07 82.52 66.24 84.03361 3.369
4 4095 726 113.20 81.32 65.38 82.64463 4.095
5 4793 698 110.36 80.50 65.57 85.95989 4.793
6 5452 659 112.11 81.75 66.57 91.04704 5.452
#つぎにfilter関数を使って,baseline,intervention,recoveryだけを抽出し,空白のセルを除外する.filter関数の|はorの意味.
> dat<-filter(dat,periods=="baseline"|periods=="intervention"|periods=="recovery")
#できあがり.
> head(dat)
time rri sbp mbp dbp hr sec periods
1 300420 700 116.69 83.64 67.12 85.71429 300.420 baseline
2 301140 720 116.39 83.41 66.93 83.33333 301.140 baseline
3 301863 723 115.20 82.69 66.43 82.98755 301.863 baseline
4 302563 700 113.30 81.94 66.26 85.71429 302.563 baseline
5 303258 695 117.00 83.31 66.47 86.33094 303.258 baseline
6 303956 698 118.60 84.62 67.63 85.95989 303.956 baseline
>
#今度は,baseline,intervention,recoveryごとに平均値を計算する.summarise関数でデータの集計(今回は平均値)ができる.
#また,group_by関数で指定したグループごとに集計できるようにする.
> dat2<-summarise(group_by(dat,periods),rri=mean(rri),hr=mean(hr),sbp=mean(sbp),mbp=mean(mbp),dbp=mean(dbp))
#出来上がり
> dat2
# A tibble: 3 x 8
periods rri hr sbp mbp dbp
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 baseline 716.3341 79.53731 111.8745 80.21522 63.89441
2 drinking 517.8547 104.19551 138.6544 95.6186 75.8722
3 recovery 723.9278 76.81315 111.9961 76.91374 61.863