ケィオスの時系列解析メモランダム

時系列解析,生体情報学,数学・物理などの解説です.

【Rでデータ処理】データテーブル操作の基礎

今回はファイルからデータテーブル (表)として読み込んで,データを処理する方法をいくつか紹介します.データ処理といっても,条件にあう列や行を抽出したりするだけです.

 ここでは,具体例として,ユニオンツールのmyBeatの心拍間隔データを使います.ファイル名は"mybeat_data.csv"とします.テキストデータの中身は以下のような感じです.

メモリ仮ID,1
RRI :1000Hz
加速度 :Peak
Start,2022/05/29
activity,v002
time,RRI,temperature,Acc X,Acc Y,Acc Z,HF,LF/HF,LF ratio,activity,HR
2022/05/29 19:02:39.000,521,25.1,0.00,0.00,0.00,0.000,0.000,0.000,-1.00,115
2022/05/29 19:02:39.530,1549,25.1,0.00,0.00,0.00,0.000,0.000,0.000,-1.00,39
2022/05/29 19:02:41.088,736,25.1,0.34,-1.16,0.09,0.000,0.000,0.000,0.21,82

これを,表に当てはめれば,以下のように感じになります.

メモリ仮ID 1
RRI :1000Hz
加速度 :Peak
Start 2022/05/29
activity v002
time RRI temperature Acc X ...
2022/05/29 19:02:39.000 521 25.1 0.00 ...
2022/05/29 19:02:39.530 1549 25.1 0.00 ...
2022/05/29 19:02:41.088 736 25.1 0.34 ...

最近,myBeat WHS-1とソフトがアップデートされて,ファイル中身の構成がちょっと変わりました。上は古いバージョンです。

ファイルの読み込み

 myBeatのデータファイル"mybeat_data.csv"をRで読み込むときは,以下のようにします.

setwd("データファイルがあるフォルダを指定")
DAT <- read.csv("mybeat_data.csv", header=TRUE, skip=5)
DAT$time <- as.POSIXct(DAT$time, tz="Japan")

このスクリプトを実行すれば,全データがデータテーブル (表)としてDATに入ります.

 このRスクリプトの2行目でファイルを読み込んでいます.skip=5で,最初の5行,つまり

メモリ仮ID,1
RRI :1000Hz
加速度 :Peak
Start,2022/05/29
activity,v002

の部分を飛ばして読み込みます.header=TRUEとすれば,

time,RRI,temperature,Acc X,Acc Y,Acc Z,HF,LF/HF,LF ratio,activity,HR

の部分を列の名前として使います (スペースは"."に変ります).

 このRスクリプトの3行目は,時間データを扱うときに必要です.私は時間データを扱うときはいつもas.POSIXctを使います.

読み込んだデータの確認

 DATに読み込まれたデータの内容を確認する方法を紹介します.

 DATの最初の部分をみるときは,

head(DAT)

とします.このコマンドで,最初の6行を見ることができます.

> head(DAT)
                 time  RRI temperature Acc.X Acc.Y Acc.Z HF LF.HF LF.ratio activity  HR
1 2022-05-29 19:02:39  521        25.1  0.00  0.00  0.00  0     0        0    -1.00 115
2 2022-05-29 19:02:39 1549        25.1  0.00  0.00  0.00  0     0        0    -1.00  39
3 2022-05-29 19:02:41  736        25.1  0.34 -1.16  0.09  0     0        0     0.21  82
4 2022-05-29 19:02:41  755        25.1  0.34 -1.16  0.09  0     0        0     0.21  79
5 2022-05-29 19:02:42  761        25.1  0.34 -1.16  0.09  0     0        0     0.21  79
6 2022-05-29 19:02:43  742        25.1  0.34 -1.16  0.09  0     0        0     0.21  81

 head(DAT, n)とすれば,最初のn行が出てきます.

 データの最後の部分をみるときは,

tail(DAT)

とします.このコマンドで,最後の6行を見ることができます.

> tail(DAT)
                      time  RRI temperature Acc.X Acc.Y Acc.Z       HF LF.HF LF.ratio activity  HR
107396 2022-05-30 19:23:03 1461        30.8 -0.59 -0.91 -1.34 304703.2 2.703   72.992     0.73  41
107397 2022-05-30 19:23:05 1303        30.8  0.69 -0.81 -1.81 270349.6 2.705   73.006     1.10  46
107398 2022-05-30 19:23:06 2539        30.8  0.69 -0.81 -1.81 210960.1 2.643   72.547     1.10  24
107399 2022-05-30 19:23:09  420        30.8  2.87 -1.09  1.66 211015.2 2.589   72.137     2.49 143
107400 2022-05-30 19:23:09  505        30.8  2.87 -1.09  1.66 199525.3 2.574   72.017     2.49 119
107401 2022-05-30 19:23:09 1779        30.8  2.87 -1.09  1.66 154124.2 2.523   71.614     2.49  34

 tail(DAT, n)とすれば,最後のn行が出てきます.

 データの行数を確認するときは,

nrow(DAT)

とします.

 各列の名前を抽出したいときは,

colnames(DAT)

とします.

列 (変数)を抽出

 DATに含まれる特定の列を取り出す方法をいくつか紹介します.

 2列目の"RRI"を抽出する場合,

DAT$RRI

とするか,

DAT[, "RRI"]

とするか,

DAT[, 2]

とします.結果はどれも同じです.

条件に合う行を抽出

 特定の条件を満たす行だけを抽出したいことがあります.そのための方法を紹介します.

 DATに含まれるRRIの値が400以上,1200未満のデータだけを取り出したいときは,

SEL <- DAT[DAT$RRI >= 400 & DAT$RRI <= 1200,]

とすれば,SELに条件に合うデータが入ります.条件は,「かつ」が"&"で,「または」が"|"です.if文で使う"&&"や"||"と違うので注意してください.

 DATの特定の日時の区間[t1, t2]を取り出したいときは,

t1 <- as.POSIXct("2022-05-30 08:00:00", tz="Japan")
t2 <- as.POSIXct("2022-05-30 17:00:00", tz="Japan")
SEL <- DAT[DAT$time >= t1 & DAT$time <= t2,]

とすれば,SELに条件に合うデータが入ります.

 Rでは,if文で一つ一つ条件を判定すると,計算時間が異常にかかるので,ここで紹介した方法をできるだけ使うようにしてください.

行を指定して抽出,削除

 DATの行番号を指定してデータを抽出する方法を紹介します.

 DATのn行目からm行目までを抽出するときは,

SEL <- DAT[n:m,]

とします.

 反対に,DATのn行目からm行目までを除くときは,

SEL <- DAT[-(n:m),]

とします.マイナスを付ければ,「除く」という意味になります.(n:m)のように,括弧を付けるのを忘れないでください.

 DATから飛び飛びの行,n1, n2, n3を取り出すときは,

SEL <- DAT[c(n1, n2, n3),]

とします.c(...)を付けるのを忘れないでください.

 n1, n2, n3を除くときは,

SEL <- DAT[-c(n1, n2, n3),]

とします.ここでもc(...)を付けるのを忘れないでください.

myBeatのCSVファイルはエクセルで上書きするな

 myBeatのデータをエクセルで扱うときの注意の動画です.
youtu.be